一、值传递和引用传递区别
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