2017-06-03 112 views
0

我是golang的初學者,正在嘗試接口。我想將接口保存在一個單獨的包中,以便我可以使用它在各種其他包中實現此功能,並將其提供給其他團隊(.a文件),以便他們可以實現自定義插件。請參閱下面的示例,瞭解我想實現的目標。如何在golang中實現不同包中的接口?

--- Folder structure --- 
gitlab.com/myproject/ 
        interfaces/ 
          shaper.go 
        shapes/ 
         rectangle.go 
         circle.go 

---- shaper.go --- 
package interfaces 

type Shaper interface{ 

    Area() int 

} 

如何確保rectangle.go實現整形器接口? 我明白,隱式實現接口,這是否意味着rectangle.go會自動實現shaper.go,即使它位於不同的包中?

我試過它像下面,但是當我運行gofmt工具,它會刪除導入,因爲它是未使用的。

--- rectangle.go --- 
package shapes 

import "gitlab.com/myproject/interfaces" 

type rectangle struct{ 

    length int 
    width int 
} 

func (r rectangle) Area() int { 
return r.length * r.width 
} 

在此先感謝。

+4

你是什麼意思「它沒有工作」? –

+1

您可以像其他軟件包一樣引用其他軟件包的接口(在您的案例中爲「interfaces.Shaper」)。在這個問題上我沒有看到任何真正的問題,你應該澄清你有什麼問題(最好通過[mcve])。 – Carpetsmoker

+0

我已經解釋了更多關於我面臨的問題。我認爲這是一個最小的完整和可驗證的例子。你能否在這方面用代碼解釋關於引用或實現接口的例子?提前致謝。 – Sanketh

回答

2

有關於接口的一個極好的section in the go wiki

轉到接口通常屬於在一個使用接口類型,而不是實現這些值包的值的包。實現包應該返回具體的(通常是指針或結構)類型:這樣,新的方法可以添加到實現中,而不需要大量的重構。

這也具有降低包裝之間的耦合(通過不強迫任何人導入您的包只是爲接口)的優勢,它通常會導致更小的接口(允許人們只消耗接口的一個子集你會建立)。

如果您是新手,我強烈建議您閱讀我關聯的「Go代碼評論評論」維基文章,如果您還有更多時間,請致電Effective Go。快樂黑客!

+0

這真的很有用。喜歡這個! –

0

比方說,你有一個功能,使用Shaper。你可以用rectangle測試功能,並通過這樣做,確保實現:

func DoStuff(s Shaper) { 
    s.Area() 
} 

func TestDoStuff(t *testing.T) { 
    var s Shaper = rectangle{length: 5, width: 3} 
    DoStuff(s) 
    // assertion 
} 

如果rectangle沒有實現Shaper,你會得到這樣的錯誤:

cannot use rectangle literal (type rectangle) as type Shaper in assignment: 
rectangle does not implement Shaper (missing Area method) 

Effective Go

Interfaces in Go provide a way to specify the behavior of an object: if something can do this, then it can be used here.