package main import "fmt" func main() { y := []int{1, 2, 3, 4, 5} // slice 是传引用的,对内容的修改会影响到函数外,但是 append 不会影响到函数外 changeRef(y) fmt.Println(y) //[100,2,3,4,5] //取引用变量的地址传入指针实现 append 可以在函数内部修改,说明引用和指针确实不是同一个概念 appendPoint(&y) fmt.Println(y) z := [5]int{1, 2, 3, 4, 5} // 数组是传值的,对内容的修改不会影响到函数外 changeArray(z) fmt.Println(z) //[1,2,3,4,5] } func changeRef(x []int) { x[0] = 100 // 这里 对函数外没有影响 x = append(x, 6, 7, 8) //但是 append 的设计比较奇怪,他返回一个新的引用,由于函数对引用的(地址)仍然是传值的,若想改变必须用返回值实现 //同时 引用又不是一个指针 无法直接修改该地址处的值 } func changeArray(x [5]int) { x[0] = 100 } func appendPoint(x *[]int) { *x = append(*x, 4, 5, 6) }