鉴于以下内容:
type AStruct struct {
m_Map map[int]bool
}
在这种情况下,在AStruct
初始化之前,不能使用AStruct.m_Map
的实例:
m_Map=make(map[int]bool,100)
在这种情况下,我已经为我的结构编写了Init()
函数:
func (s *AStruct) Init() {
s.m_Map=make(map[int]bool,100)
}
我并不特别关心这个设计,因为它需要(s *AStruct) Init()
是公共的,并且要求客户端在使用AStuct
的实例之前明确地调用它 - 在此期间不可用的实例AStuct
已经存在,等待生成panic
。
我可以将init()
设为私有,并在initialized bool
之后在struct
中设置true
标记,并在每个方法初始化后设置init()
并检查每种方法:
func (s *AStruct) DoStuff {
if !s.initialized {
s.init()
}
s.m_Map[1]=false
s.m_Map[2]=true
}
但这很尴尬,并添加了多余的代码。
Go中是否有标准的处理方法?保证m_Map的一个将被初始化而不依赖于客户端来调用Init()
?
答案 0 :(得分:8)
类型Foo
的标准是编写构造函数NewFoo()
,它不是类型上的方法,但返回类型为Foo
的值(或*Foo
)。然后,只要通过调用Foo
生成NewFoo()
的所有实例(而不是通过文字或对new()
内置的调用),您就会安全。< / p>