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 關注
- 118 瀏覽
添加回答
舉報