我认为在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)
}
打印的结果是:
[0] [0 1] [0]
虽然我在期待
[0] [0 1] [0 1]
答案 0 :(得分:12)
切片的长度保留在未通过引用传递的切片标头中。您可以将切片视为包含指向数组的指针,长度和容量的结构。
当您附加到切片时,您修改了数据数组中的索引1,然后增加了切片标头中的长度。当您返回时,main函数中的c
长度为1,因此打印相同的数据。
切片以这种方式工作的原因是,您可以让多个切片指向相同的数据。例如:
x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]
这三个切片都指向同一底层数组中的重叠数据。
答案 1 :(得分:1)
Go总是按值传递。某些类型是引用类型,如指针,地图,通道;或部分引用类型,如切片(由对底层数组的引用以及长度和容量的值组成)。但无论类型如何,一切都是通过价值传递的。因此,分配给局部变量永远不会影响任何外部变量。