2 回答

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
我會(huì)說(shuō)只是沒(méi)有New功能:
struct MyStruct {
myField1 string
myField2 string
myField3 string
}
val := MyStruct{
myField1: "one",
myField2: "two",
myField3: "three",
}
如果需要從另一個(gè)包設(shè)置未導(dǎo)出的字段,請(qǐng)使用某種選項(xiàng)或配置:
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貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
就個(gè)人而言(顯然取決于結(jié)構(gòu)的目標(biāo))我是功能選項(xiàng)的忠實(shí)粉絲:
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"),
...
)
這有兩個(gè)好處:
new 的調(diào)用者無(wú)需擔(dān)心順序
傳遞值使用字段名稱(chēng)是顯式的,這意味著您不會(huì)混淆 Field1 和 Field2
您可以傳遞不同的默認(rèn)值
MyStruct
以防調(diào)用者不傳遞WithField1
添加更多字段不會(huì)導(dǎo)致必須更新所有調(diào)用者
New
- 2 回答
- 0 關(guān)注
- 115 瀏覽
添加回答
舉報(bào)