我将切片作为arg传递并附加它,为什么不修改原始切片[重复]

问题描述 投票:0回答:0

我知道切片包含底层数组的数据指针。我知道如果我将切片传递给函数,并且当切片的底层数组增长时不会修改原始切片,因为会生成一个新的数据指针。

让我困惑的是下面是我的测试代码。切片 arg 可能不会增长或生成新指针,但为什么更改不会影响原始切片?

func TestAppend(t *testing.T) {
    a := make([]int, 3, 4)
    fmt.Println("before call ", len(a), cap(a), a)

    changeSliceAppend(a)

    fmt.Println("after call ", len(a), cap(a), a)
}

func changeSliceAppend(s []int) {
    fmt.Println("before append ", len(s), cap(s), s)
    s = append(s, 10)
    fmt.Println("after append ", len(s), cap(s), s)
}

这是代码运行结果。

before call  3 4 [0 0 0]
before append  3 4 [0 0 0]
after append  4 4 [0 0 0 10]
after call  3 4 [0 0 0]

我认为调用后应该是

4 4 [0 0 0 10]
但事实是3 4 [0 0 0]。 附加元素去哪里?

go slice
© www.soinside.com 2019 - 2024. All rights reserved.