Go 数组、切片作为函数的参数。值传递、引用传递

demo.go(切片、数组作为函数的形参):

package main

import "fmt"

// 值传递:改变形参的值,并不会改变实参的值。(例如:数组)
// 地址传递(引用传递):改变形参的值,会影响到实参的值。(例如:切片、map)(切片变量名本身就是一个地址)

// 数组作为函数的参数,是值传递。 修改形参不会改变实参的值。(可以通过返回值来覆盖(修改)实参的值)
// 切片的数据存放在内存的堆区。 数组的数据(函数的局部变量)存放在内存的栈区

func main() {
	// 定义切片。
	slice := []int{0, 1, 2, 3, 4}
	test(slice)
	fmt.Printf("%p \n", slice) // 0xc000072030
	fmt.Println(slice)   // [111 1 2 3 4]  (修改形参会影响到实参)
}

// 切片作为函数的参数(地址传递) (切片变量名本身就是一个地址)
func test(s []int) {
	fmt.Printf("%p \n", s) // 0xc000072030 与实参的地址相同
	s[0] = 111     // 修改形参会影响到实参

	// 但是 append()添加数据时并不会影响实参(的长度)。 (可以通过返回值覆盖(修改)实参的值(长度))
	s = append(s, 66,77,88)
}

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/88650067