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

那么,为什么它们(下面的 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]的字符串就会乱码。


慕工程0101907
浏览 159回答 1
1回答

浮云间

您的“No.1”方法附加到一个nil切片,该切片保证如果提供的参数超过零,则将分配一个新的支持数组。您的“No.2”方法不会创建新切片,它只是切片参数。如果Assign()通过传递现有切片来调用,则第二种方法将存储它,如果其元素被修改,它将反映在存储的切片中。让我们稍微修改一下您的示例以对其进行测试:type T1 struct {&nbsp; &nbsp; local []string}func (t *T1) Assign1(param ...string) {&nbsp; &nbsp; t.local = nil&nbsp; &nbsp; t.local = append(t.local, param...) // No.1 <<<}func (t *T1) Assign2(param ...string) {&nbsp; &nbsp; t.local = nil&nbsp; &nbsp; 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反映了对原始元素所做的更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go