传播操作员模拟

时间:2018-09-21 09:34:48

标签: go struct 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"
}

我想创建一个切片结构(Obj),该切片将包含ValidObject,只更改了某些字段。我认为最好的解释方法是使用伪代码,所以这里是(使用JS的散布运算符)):

var slc = []Obj{
  {
    ...ValidObject,
    code: "Other value",
  },
  {
    ...ValidObject,
    mit: "Other value"
  }
}

2 个答案:

答案 0 :(得分:3)

创建一个使用Object,更改其code并返回新的Object的辅助函数:

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

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

使用此任务,您将:

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

输出(在Go Playground上尝试):

[{AK93-KADJ9-92J76 Other value MSLA-923-OKSW}
    {AK93-KADJ9-92J76 Yet another value MSLA-923-OKSW}]

该帮助器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
}

然后使用它:

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

输出(在Go Playground上尝试):

[{ssid2 code2 MSLA-923-OKSW} {ssid3 SKO-120O mit2}]

答案 1 :(得分:-1)

全局创建一个切片结构var objCollector = []obj{},将数据读取到已定义的结构中,并将对象append读取到我们创建的结构切片中。

type Obj struct {
    ssid string
    code string
    mit  string
}

var objCollector = []obj{}

func main() {
    var ValidObject = Obj{
        ssid: "AK93-KADJ9-92J76",
        code: "SKO-120O",
        mit:  "MSLA-923-OKSW",
    }
    append(objectCollector, ValidObject)
}