Go中的构造函数

我有一个结构,我希望它有一些合理的默认值初始化。

通常情况下,这里要做的事情是使用构造函数,但是由于go在传统意义上并不是真正的OOP,所以它们不是真正的对象,也没有构造函数。

我注意到init方法,但是在包级别。 是否还有其他类似的结构级别可以使用?

如果不是Go的这种types的东西被接受的最佳做法?

实际上有两个被接受的最佳实践:

  1. 使您的结构的零值是一个合理的默认值。 (虽然这看起来很奇怪,大多数人来自“传统”的OOP它经常工作,真的很方便)。
  2. 提供一个函数func New() YourTyp或者如果你的包函数中有几个这样的typesfunc NewYourType1() YourType1等等。

如果你的types的零值是可用或不可用的(在这种情况下,它必须由New...函数之一来设置)(对于“传统的”oops:没有阅读文档的人不会即使他不能以未定义的状态创build对象,也能正确使用你的types。)

有一些等价的构造函数,当零值不能做出合理的默认值或当某些参数是必要的结构初始化。

假设你有这样的结构:

 type Thing struct { Name string Num int } 

那么,如果零值不合适,通常会用NewThing函数构造一个实例,返回一个指针:

 func NewThing(someParameter string) *Thing { p := new(Thing) p.Name = someParameter p.Num = 33 // <- a very sensible default value return p } 

当你的结构很简单的时候,你可以使用这个简洁的结构:

 func NewThing(someParameter string) *Thing { return &Thing{someParameter, 33} } 

如果你不想返回一个指针,那么一个练习就是调用函数makeThing而不是NewThing

 func makeThing(name string) Thing { return Thing{name, 33} } 

参考: 分配新的有效的去 。

去有对象。 对象可以有构造函数(虽然不是自动构造函数)。 最后,Go是一个OOP语言(数据types有附加的方法,但是对于OOP是什么都有无尽的定义)。

不过,接受的最佳做法是为您的types编写零个或多个构造函数。

正如@dystroy在我完成这个答案之前发布了他的答案,让我只是添加他的示例构造函数的替代版本,我可能会写作:

 func NewThing(someParameter string) *Thing { return &Thing{someParameter, 33} // <- 33: a very sensible default value } 

我想告诉你这个版本的原因是,经常使用“内联”文字而不是“构造函数”调用。

 a := NewThing("foo") b := &Thing{"foo", 33} 

现在*a == *b

Go中没有默认的构造函数,但是可以声明任何types的方法。 你可以习惯于声明一个叫做“Init”的方法。 不知道这是如何与最佳做法相关的,但它有助于保持名字短而不失明晰。

 package main import "fmt" type Thing struct { Name string Num int } func (t *Thing) Init(name string, num int) { t.Name = name t.Num = num } func main() { t := new(Thing) t.Init("Hello", 5) fmt.Printf("%s: %d\n", t.Name, t.Num) } 

结果是:

 Hello: 5 

另一种方式是;

 package person type Person struct { Name string Old int } func New(name string, old int) *Person { // set only specific field value with field key return &Person{ Name: name, } } 

Golang在其官方文件中不是OOP语言。 Golang结构的所有字段都有一个确定的值(不像c / c ++),所以构造函数没有cpp那么必要。 如果您需要分配一些特殊值的字段,请使用工厂function。 Golang的社区build议新的模式名称。