我有一个结构,我希望用一些合理的默认值对其进行初始化。
通常,这里要做的是使用构造函数,但由于 go 在传统意义上并不是真正的 OOP,因此它们不是真正的对象,并且它没有构造函数。
我注意到了 init 方法,但那是在包级别。还有其他类似的东西可以在结构级别使用吗?
如果不是,Go 中此类事物的公认最佳实践是什么?
原文由 Marty Wallace 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个结构,我希望用一些合理的默认值对其进行初始化。
通常,这里要做的是使用构造函数,但由于 go 在传统意义上并不是真正的 OOP,因此它们不是真正的对象,并且它没有构造函数。
我注意到了 init 方法,但那是在包级别。还有其他类似的东西可以在结构级别使用吗?
如果不是,Go 中此类事物的公认最佳实践是什么?
原文由 Marty Wallace 发布,翻译遵循 CC BY-SA 4.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}
}
原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 3.0 许可协议
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2k 阅读✓ 已解决
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
实际上有两个公认的最佳实践:
func New() YourTyp
或者如果你的包函数中有几个这样的类型func NewYourType1() YourType1
等等。记录您的类型的零值是否可用(在这种情况下,它必须由
New...
函数之一设置。(对于“传统主义者”哎呀:不阅读文档的人将无法正确使用您的类型,即使他无法在未定义状态下创建对象。)