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]

浙公网安备 33010602011771号