其实和js一样,主要看是基本数据类型还是引用数据类型
基本数据类型值传递。引用数据类型引用传递
但是
package main import "fmt" func main() { a := 1 var f1 = func(a int) { a += 1 } f1(a) fmt.Println(a) // 值传递 1还是1 不会变2 b := map[string]string{ "name":"jack", } var f2 = func(a map[string]string) { a["name"] = "rose" } f2(b) fmt.Println(b) // 引用传递 - jack会变成rose }
但是slice又不太一样,append会变更地址相当于值传递,而没有append的时候又是引用传递
package main import "fmt" func main() { c := []int{1} var f3 = func(c []int) { c[0] = 3 //不会改变c的地址 - 将会变成引用传递 } f3(c) fmt.Println(c) d := []int{1} fmt.Printf("地址p = %p\n",d) var f4 = func(d []int) { d = append(d, 2) //会改变c的地址 fmt.Printf("地址p = %p\n",d) } f4(d) fmt.Println(d) }
博客:
https://zhuanlan.zhihu.com/p/366908019
https://www.cnblogs.com/wang_yb/p/12126884.html