2 回答
TA贡献1808条经验 获得超4个赞
我会说只是没有New功能:
struct MyStruct {
myField1 string
myField2 string
myField3 string
}
val := MyStruct{
myField1: "one",
myField2: "two",
myField3: "three",
}
如果需要从另一个包设置未导出的字段,请使用某种选项或配置:
type MyStruct struct {
Exported string
unexported string
}
type MyStructOptions struct {
Exported string
Unexported string
}
func NewMyStruct(opts MyStructOptions) *MyStruct {
return &MyStruct{
Exported: opts.Exported,
unexported: opts.Unexported,
}
}
TA贡献1946条经验 获得超3个赞
就个人而言(显然取决于结构的目标)我是功能选项的忠实粉丝:
type MyStructOpts func(*MyStruct)
func WithField1(field1 string) MyStructOps {
return func(m *MyStruct) {
m.myField1 = field1
}
}
func New(opts ...MyStructOpts) *MyStruct {
m := MyStruct{
myField1: "someDefaultIfneeded",
}
for _, opt := range opts {
opt(&m)
}
return &m
}
可以按如下方式使用:
New(
WithField1("someString"),
...
)
这有两个好处:
new 的调用者无需担心顺序
传递值使用字段名称是显式的,这意味着您不会混淆 Field1 和 Field2
您可以传递不同的默认值
MyStruct
以防调用者不传递WithField1
添加更多字段不会导致必须更新所有调用者
New
- 2 回答
- 0 关注
- 94 浏览
添加回答
举报