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 关注
- 260 浏览
添加回答
举报
