扩展运算符类似物

Src*_*Src 6 struct go slice

我有一个结构体和该结构体的实例:

type Obj struct {
  ssid string
  code string
  mit string
  // and other props (23)
}

var ValidObject = Obj {
  ssid: "AK93-KADJ9-92J76",
  code: "SKO-120O"
  mit: "MSLA-923-OKSW"
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个结构体切片(Obj),其中ValidObject仅包含一些更改的字段。我认为解释这一点的最好方法是使用伪代码,所以这里是(使用 JS 中的扩展运算符:)):

var slc = []Obj{
  {
    ...ValidObject,
    code: "Other value",
  },
  {
    ...ValidObject,
    mit: "Other value"
  }
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 8

创建一个辅助函数,它接受一个Object、更改它code并返回新的Object

func withCode(obj Obj, code string) Obj {
    obj.code = code
    return obj
}
Run Code Online (Sandbox Code Playgroud)

请注意,withCode采用非指针值,因此Object您传递的内容不会被修改,只会修改本地副本。

使用它你的任务是:

var slc = []Obj{
    withCode(ValidObject, "Other value"),
    withCode(ValidObject, "Yet another value"),
}
fmt.Println(slc)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

[{AK93-KADJ9-92J76 Other value MSLA-923-OKSW}
    {AK93-KADJ9-92J76 Yet another value MSLA-923-OKSW}]
Run Code Online (Sandbox Code Playgroud)

这个助手withCode甚至可以是一个方法(而不是函数)。

请注意,如果您需要多个字段的变体,最好将它们添加为方法,以便您可以链接调用。

例如:

func (o Obj) withCode(code string) Obj {
    o.code = code
    return o
}

func (o Obj) withSsid(ssid string) Obj {
    o.ssid = ssid
    return o
}

func (o Obj) withMit(mit string) Obj {
    o.mit = mit
    return o
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

var slc = []Obj{
    ValidObject.withCode("code2").withSsid("ssid2"),
    ValidObject.withMit("mit2").withSsid("ssid3"),
}
fmt.Println(slc)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

[{ssid2 code2 MSLA-923-OKSW} {ssid3 SKO-120O mit2}]
Run Code Online (Sandbox Code Playgroud)