是否有标准惯用的Go for"构造函数"?

时间:2014-03-29 20:32:43

标签: constructor go initialization idioms

鉴于以下内容:

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()

1 个答案:

答案 0 :(得分:8)

类型Foo的标准是编写构造函数NewFoo(),它不是类型上的方法,但返回类型为Foo的值(或*Foo )。然后,只要通过调用Foo生成NewFoo()的所有实例(而不是通过文字或对new()内置的调用),您就会安全。< / p>