我有一个结构体和该结构体的实例:
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)
创建一个辅助函数,它接受一个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)
| 归档时间: |
|
| 查看次数: |
10801 次 |
| 最近记录: |