为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号