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:
闭包,传递的是引用。其实不用记,想想就应该这样