第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何處理 `New(...` 函數(shù)中的長(zhǎng)參數(shù)列表

如何處理 `New(...` 函數(shù)中的長(zhǎng)參數(shù)列表

Go
蠱毒傳說(shuō) 2022-11-23 15:51:08
假設(shè)我有一個(gè)本地化的結(jié)構(gòu)MyStruct,其主體如下:struct MyStruct {  myField1 string  myField2 string  myField3 string  ...  myFieldN string}MyStruct以及一個(gè)為外部調(diào)用者實(shí)例化 new 的函數(shù):func NewMyStruct(myField1, myField2, myField3, ..., myFieldN string) MyStruct {  return MyStruct{    myField1: myField1,    myField2: myField2,    myField3: myField3,    ...    myFieldN: myFieldN,  }}問(wèn)題:我如何最好地處理結(jié)構(gòu)中有太多字段導(dǎo)致NewMyStruct(...函數(shù)參數(shù)太多的情況?是否有緩解此問(wèn)題的最佳做法?截至目前,我的代碼庫(kù)中有幾個(gè)這樣的函數(shù):func NewSuperStruct(myField1, myField2, myField3, myField4, myField5, myField6, myField7, myField8, myField9, myField10, myField11, myField12, myField13, myField14, myField15, myField16, myField17, myField18, myField19, myField20, myField21, myField22) ...但在屬性/字段不屬于其中的意義上,結(jié)構(gòu)本身并不一定是無(wú)意義的,在我的應(yīng)用程序中它們確實(shí)有意義,結(jié)構(gòu)太大了,僅此而已。
查看完整描述

2 回答

?
炎炎設(shè)計(jì)

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,

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
智慧大石

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


查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 115 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)