2 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
因此,主要用例是您可以從包函數(shù)返回未導(dǎo)出的類型。然后可以在此類型上使用任何導(dǎo)出的方法,即使其他包實(shí)際上無法首先創(chuàng)建該類型(除了從包中將其作為返回值接收)。
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()
}
另一個(gè)主要用例是包級接口。我傾向于使用一個(gè)相當(dāng)標(biāo)準(zhǔn)的模式,其中一個(gè)包定義了一個(gè)導(dǎo)出的接口,如下所示:
type Doer interface {
Do()
}
然后定義一些滿足該接口的私有類型:
type stringDoer struct {}
func (s *stringDoer) Do() {}
func NewStringDoer() Doer {
return &stringDoer{}
}
這樣,外部包可以將我的類型用作接口,而不必亂用具體類型,并且由于我的包的公開數(shù)據(jù)類型完全是接口,它使得對我的包的模擬或存根調(diào)用(例如,用于測試)非常容易。
為了使這種類型的系統(tǒng)工作,必須導(dǎo)出結(jié)構(gòu)(在本例中為stringDoer)上的方法,即使結(jié)構(gòu)本身不是。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是取消導(dǎo)出它的提交:https ://github.com/btcsuite/btcd/commit/7411e65b1e8d4e4c6da198590ad627bfe253173c 。從提交消息:
此提交取消導(dǎo)出 Stack 類型,因?yàn)樗鼉H打算在腳本執(zhí)行期間在內(nèi)部使用。此外,引擎公開了 {G,S}etStack 和 {G,S}etAltStack 函數(shù),它們將項(xiàng)目作為字節(jié)切片 ([][]byte) 的切片返回,以便在步進(jìn)時(shí)調(diào)用者訪問。
我相信你是正確的,你(在包外)不能使用這個(gè)結(jié)構(gòu)。它純粹在包實(shí)現(xiàn)中使用。
- 2 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報(bào)