为了账号安全,请及时绑定邮箱和手机立即绑定

Go中这两种“切片复制”方法有什么区别

Go中这两种“切片复制”方法有什么区别

Go
慕工程0101907 2022-06-13 16:00:24
那么,为什么它们(下面的 No.1 和 No.2)不同?type T1 struct {    local []string}func (t *T1) Assign(param ...string) {    t.local = nil    t.local = append(t.local, param...) // No.1 <<<    t.local = param[:]                  // No.2 <<<}它们肯定是不同的:No.2 相当“浅”。一改的话,如果用2号的话,原来t.local[i]的字符串就会乱码。
查看完整描述

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反映了对原始元素所做的更改。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号