亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理 `New(...` 函數中的長參數列表

如何處理 `New(...` 函數中的長參數列表

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

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,

    }

}


查看完整回答
反對 回復 2022-11-23
?
智慧大石

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


查看完整回答
反對 回復 2022-11-23
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號