第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

golang public 方法到私有結(jié)構(gòu) - 這有任何用例嗎

golang public 方法到私有結(jié)構(gòu) - 這有任何用例嗎

Go
飲歌長嘯 2022-01-17 20:03:12
我是新來的。我注意到在一些庫中有私有結(jié)構(gòu)的公共方法。參見例如https://github.com/btcsuite/btcd/blob/master/txscript/stack.go這有真正的用例嗎?如果我也無法訪問它們所屬的結(jié)構(gòu),我無法想象如何使用公共方法。作為以下問題 - 有沒有辦法克服結(jié)構(gòu)的私有聲明?例如,我想使用我包中指定文件中的結(jié)構(gòu)堆棧。
查看完整描述

2 回答

?
慕神8447489

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)本身不是。


查看完整回答
反對 回復(fù) 2022-01-17
?
寶慕林4294392

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)中使用。


查看完整回答
反對 回復(fù) 2022-01-17
  • 2 回答
  • 0 關(guān)注
  • 197 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號