go语言学习十四 - slice 传引用,但引用不是地址指针

package main

import "fmt"

func main() {

	y := []int{1, 2, 3, 4, 5}

	// slice 是传引用的,对内容的修改会影响到函数外
	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)
}

猜你喜欢

转载自www.cnblogs.com/scala/p/9592891.html