vod*_*095 82

一个可能的想法是编写单独的构造函数

//Something is the structure we work with
type Something struct {
     Text string 
     DefaultText string 
} 
// NewSomething create new instance of Something
func NewSomething(text string) Something {
   something := Something{}
   something.Text = text
   something.DefaultText = "default text"
   return something
}
Run Code Online (Sandbox Code Playgroud)
  • @Prateek是的,你可以强迫人们使用这个构造函数,如果你只是让类型本身未导出.您可以导出函数`NewSomething`甚至是`Text`和`DefaultText`字段,但只是不导出struct类型`something`. (25认同)
  • 是的,这是我在答案中也提到的方法之一,但我们无法强迫任何人只使用此功能. (5认同)
  • 问题更严重......如果使用第三方(例如库)来实例化您的结构(例如,通过`reflect.New()`),则不能期望它知道您的特别命名工厂功能。在那种情况下,如果没有改变语言本身,我认为*只有*一个接口(库可以检查)会做。 (2认同)
  • 设置默认值很好,但有时,我可能想覆盖默认值。在这种情况下,我将无法使用非默认值初始化结构。对我来说有点烦 (2认同)