2 回答

TA貢獻1780條經驗 獲得超1個贊
因此,主要用例是您可以從包函數返回未導出的類型。然后可以在此類型上使用任何導出的方法,即使其他包實際上無法首先創建該類型(除了從包中將其作為返回值接收)。
package foobar
type foo struct {}
func (f foo) Bar() {}
func Newfoo() foo {
return foo{}
}
----
package main
func main() {
f := foobar.Newfoo()
f.Bar()
foobar.NewFoo().Bar()
}
另一個主要用例是包級接口。我傾向于使用一個相當標準的模式,其中一個包定義了一個導出的接口,如下所示:
type Doer interface {
Do()
}
然后定義一些滿足該接口的私有類型:
type stringDoer struct {}
func (s *stringDoer) Do() {}
func NewStringDoer() Doer {
return &stringDoer{}
}
這樣,外部包可以將我的類型用作接口,而不必亂用具體類型,并且由于我的包的公開數據類型完全是接口,它使得對我的包的模擬或存根調用(例如,用于測試)非常容易。
為了使這種類型的系統工作,必須導出結構(在本例中為stringDoer)上的方法,即使結構本身不是。

TA貢獻2021條經驗 獲得超8個贊
這是取消導出它的提交:https ://github.com/btcsuite/btcd/commit/7411e65b1e8d4e4c6da198590ad627bfe253173c 。從提交消息:
此提交取消導出 Stack 類型,因為它僅打算在腳本執行期間在內部使用。此外,引擎公開了 {G,S}etStack 和 {G,S}etAltStack 函數,它們將項目作為字節切片 ([][]byte) 的切片返回,以便在步進時調用者訪問。
我相信你是正確的,你(在包外)不能使用這個結構。它純粹在包實現中使用。
- 2 回答
- 0 關注
- 194 瀏覽
添加回答
舉報