go值传递的理解

值传递的参数类型

go中只有值传递,但是参数类型分为值类型和引用类型

是值类型时,实际传递的是一个副本,在栈上重新开辟了一份空间,是深拷贝

是引用类型时,实际传递整个值作为副本,但是指向的底层数据地址还是一样,是浅拷贝

比如切片类型的底层数组在传递时不会改变

地址测试

package main

import "fmt"

func main() {
	var array [3]int = [3]int{1, 2, 3}
	var slice []int = []int{1, 2, 3}
	fmt.Printf("main_array: %p\n", &array)
	fmt.Printf("main_slice: %p\n", &slice)

	AddrArray(array)
	AddrSlice(slice)

}

func AddrArray(val [3]int) {
	fmt.Printf("func_array: %p\n", &val)

}

func AddrSlice(val []int) {
	fmt.Printf("func_slice: %p\n", &val)

}

main_array: 0xc0000a8000
main_slice: 0xc00009a018
func_array: 0xc0000a8030
func_slice: 0xc00009a030

虽然main和func中slice的地址不一样,但是这两个slice指向的底层数组是同一个的

底层数据测试

package main

import "fmt"

func main() {
	var slice []int = []int{1, 2, 3}

	fmt.Printf("before: %+v\n", slice)
	ModifySlice(slice)
	fmt.Printf("after: %+v\n", slice)

}

func ModifySlice(val []int) {
	val[0] = 0
}

before: [1 2 3]
after: [0 2 3]
posted @ 2025-03-28 19:11  小依昂阳  阅读(7)  评论(0)    收藏  举报