1 回答
TA贡献1829条经验 获得超4个赞
您的“No.1”方法附加到一个nil切片,该切片保证如果提供的参数超过零,则将分配一个新的支持数组。
您的“No.2”方法不会创建新切片,它只是切片参数。
如果Assign()通过传递现有切片来调用,则第二种方法将存储它,如果其元素被修改,它将反映在存储的切片中。
让我们稍微修改一下您的示例以对其进行测试:
type T1 struct {
local []string
}
func (t *T1) Assign1(param ...string) {
t.local = nil
t.local = append(t.local, param...) // No.1 <<<
}
func (t *T1) Assign2(param ...string) {
t.local = nil
t.local = param[:] // No.2 <<<
}
测试它:
t1 := &T1{}
s := []string{"a", "b", "c"}
t1.Assign1(s...)
fmt.Println(t1.local)
s[0] = "x"
fmt.Println(t1.local)
s = []string{"a", "b", "c"}
t1.Assign2(s...)
fmt.Println(t1.local)
s[0] = "x"
fmt.Println(t1.local)
输出(在Go Playground上试试):
[a b c]
[a b c]
[a b c]
[x b c]
如您所见,使用 时Assing1(),local修改传递的切片不会影响切片。
使用 时Assing2(),切片的元素local反映了对原始元素所做的更改。
- 1 回答
- 0 关注
- 158 浏览
添加回答
举报
