package main import ( "fmt" ) func main() { fmt.Println("Hello, playground") var str string = "1241341" fmt.Println(&str) fmt.Println(MyString(str)) m := map[string]string {"A": "A"} fmt.Printf("m before %p ", &m) modify(m) fmt.Println("m val: ", m["A"]) } func MyString(v string) *string { return &v } func modify(m map[string]string) { fmt.Printf("m after %p ", &m) m["A"] = "B" }
Hello, playground 0x1040c130 0x1040c138 m before 0x1040c140 m after 0x1040c148 m val: B
结论:
1)golang参数传递都是值传递,即会复制一份副本。
2)值传递为何会改变了map?
sclice、map、chan、interface和function都属于引用类型,引用类型复传参时复制的是一份指针,其指向底层数据结构相同。因此可改变之。
update:
闭包,传递的是引用。其实不用记,想想就应该这样