1
考虑以下几点:是否有标准的习惯用语“构造函数”?
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)
}
我不特别在乎这个设计,因为它需要ires (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()
?
这是一个例外,如果类型'Foo'是包'foo'中唯一的导出类型,在这种情况下,您可以简单地调用构造函数'New',以便用户编写'foo.New()'而不是' foo.NewFoo()'。 – Evan
_constructor_ - 我叫它工厂,但没关系。良好的设计要求所有的对象都应该通过工厂来获取,并且采用垃圾收集的语言,在没有所有权问题并且知道何时删除对象引用的情况下,实现起来非常简单。绝对是这样做的方式。 – Vector
@comeAndGo,考虑查看标准的Go库 - 它大量使用这种方法。 – kostix