如何处理 `New(...` 函数中的长参数列表

假设我有一个本地化的结构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) ...

但在属性/字段不属于其中的意义上,结构本身并不一定是无意义的,在我的应用程序中它们确实有意义,结构太大了,仅此而已。



蛊毒传说
浏览 79回答 2
2回答

炎炎设计

我会说只是没有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,    }}

智慧大石

就个人而言(显然取决于结构的目标)我是功能选项的忠实粉丝: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
打开App,查看更多内容
随时随地看视频慕课网APP