2014-03-29 38 views
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设置trueinit()一切都被初始化后,检查每个方法:

func (s *AStruct) DoStuff { 

    if !s.initialized { 
     s.init() 
    } 

    s.m_Map[1]=false 
    s.m_Map[2]=true 
} 

但是,这是尴尬的,并增加了多余的代码。

Go有没有标准的处理方法?保证m_Map的一个将被初始化而不依赖于客户端调用Init()

回答

8

一类Foo标准是写一个构造NewFoo()这不是对类型的方法,但返回类型Foo(或*Foo)的值。然后只要Foo的所有实例都是通过调用NewFoo()(而不是通过文字或致电new()内建)生成的,那么您就安全了。

+7

这是一个例外,如果类型'Foo'是包'foo'中唯一的导出类型,在这种情况下,您可以简单地调用构造函数'New',以便用户编写'foo.New()'而不是' foo.NewFoo()'。 – Evan

+0

_constructor_ - 我叫它工厂,但没关系。良好的设计要求所有的对象都应该通过工厂来获取,并且采用垃圾收集的语言,在没有所有权问题并且知道何时删除对象引用的情况下,实现起来非常简单。绝对是这样做的方式。 – Vector

+2

@comeAndGo,考虑查看标准的Go库 - 它大量使用这种方法。 – kostix

相关问题