Go 中的构造函数

新手上路,请多包涵

我有一个结构,我希望用一些合理的默认值对其进行初始化。

通常,这里要做的是使用构造函数,但由于 go 在传统意义上并不是真正的 OOP,因此它们不是真正的对象,并且它没有构造函数。

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

如果不是,Go 中此类事物的公认最佳实践是什么?

原文由 Marty Wallace 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 476
2 个回答

实际上有两个公认的最佳实践:

  1. 使结构的零值成为合理的默认值。 (虽然对于大多数来自“传统”oop 的人来说这看起来很奇怪,但它经常有效并且非常方便)。
  2. 提供一个函数 func New() YourTyp 或者如果你的包函数中有几个这样的类型 func NewYourType1() YourType1 等等。

记录您的类型的零值是否可用(在这种情况下,它必须由 New... 函数之一设置。(对于“传统主义者”哎呀:不阅读文档的人将无法正确使用您的类型,即使他无法在未定义状态下创建对象。)

原文由 Volker 发布,翻译遵循 CC BY-SA 3.0 许可协议

当零值不能成为合理的默认值或当结构初始化需要某些参数时,有一些构造函数的等价物。

假设你有这样的结构:

 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}
}

参考: Effective Go 中的 new 分配

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题