其實和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