一、值傳遞和引用傳遞區別
package main import ( "fmt" ) func main() { // map m := make(map[int]string) m[0] = "a" m[1] = "b" changeMap(m) fmt.Printf("map:%+v", m) //輸出 map:map[0:aaa 1:b] fmt.Println() //array var a = [2]string{"a", "b"} changeArray(a) fmt.Printf("array:%+v", a) //輸出array:[a b] fmt.Println() //slice var s = []string{"a", "b"} changeSlice(s) fmt.Printf("slice:%+v", s) //輸出slice:[aaa b] } func changeMap(m map[int]string) { m[0] = "aaa" } func changeArray(a [2]string) { a[0] = "aaa" } func changeSlice(s []string) { s[0] = "aaa" }
二、結構體傳遞指針或者值
1、值傳遞
package main type T struct{ Value int } func main(){ myT := T{Value:666} change(myT) println(myT.Value) } func change(t T){ t.Value = 999
程序的輸出是 666 ,因為這種方法傳遞的是值一個副本,在change() 函數中,你實際上修改的是副本的值
2、指針傳遞
package main type T struct{ Value int } func main(){ myT := T{Value:666} change(&myT) println(myT.Value) } func change(t *T){ t.Value = 999 }
這段程序使用了&取地址操作符來獲取結構體的地址,而change()函數期望一個T結構體的地址類型 *T,這里*T的意思是指向類型T值得指針;
程序運行輸出 999