为什么GO中的切片内容没有改变?

Kid*_*Kid 4 go slice

我认为在GO语言中,切片通过引用传递.但是为什么以下代码不会改变切片c的内容?我错过了什么吗?谢谢.

package main

import (
    "fmt"
)


func call(c []int) {
    c = append(c, 1)
    fmt.Println(c)
}

func main() {
    c := make([]int, 1, 5)
    fmt.Println(c)
    call(c)
    fmt.Println(c)
}
Run Code Online (Sandbox Code Playgroud)

打印结果是:

[0] [0 1] [0]

虽然我在期待

[0] [0 1] [0 1]

Ste*_*erg 12

切片的长度保留在切片头中,切片头不通过引用传递.您可以将切片视为包含指向数组的指针,长度和容量的结构.

附加到切片后,您修改了数据数组中的索引1,然后增加了切片标头中的长度.当你返回时,c在main函数中长度为1,因此打印相同的数据.

切片以这种方式工作的原因是,您可以让多个切片指向相同的数据.例如:

x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]
Run Code Online (Sandbox Code Playgroud)

这三个切片都指向同一底层数组中的重叠数据.