亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

golang public 方法到私有結構 - 這有任何用例嗎

golang public 方法到私有結構 - 這有任何用例嗎

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

2 回答

?
慕神8447489

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)上的方法,即使結構本身不是。


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

TA貢獻2021條經驗 獲得超8個贊

這是取消導出它的提交:https ://github.com/btcsuite/btcd/commit/7411e65b1e8d4e4c6da198590ad627bfe253173c 。從提交消息:

此提交取消導出 Stack 類型,因為它僅打算在腳本執行期間在內部使用。此外,引擎公開了 {G,S}etStack 和 {G,S}etAltStack 函數,它們將項目作為字節切片 ([][]byte) 的切片返回,以便在步進時調用者訪問。

我相信你是正確的,你(在包外)不能使用這個結構。它純粹在包實現中使用。


查看完整回答
反對 回復 2022-01-17
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號