我在go.Now我有一個關於functoin通過variable.Here問題一個新的另一個FUNC變化圖是代碼:golang一個結構
type User struct {
Name string
Map map[string]string
}
func main() {
u := User{Name: "Leto"}
u.Map = make(map[string]string)
fmt.Println("before --------")
fmt.Println(unsafe.Pointer(&u))
fmt.Println(unsafe.Pointer(&(u.Map)))
fmt.Println(u)
Modify(u)
fmt.Println("after --------")
fmt.Println(u)
}
func Modify(u User) {
fmt.Println("in func --------")
fmt.Println(unsafe.Pointer(&u))
fmt.Println(unsafe.Pointer(&(u.Map)))
u.Name = "Paul"
u.Map["t"] = "t"
}
以上代碼的輸出:
before --------
0xc04203a4c0
0xc04203a4d0
{Leto map[]}
in func --------
0xc04203a500
0xc04203a510
after --------
{Leto map[t:t]}
修改func我知道用戶是副本,所以更改名稱不工作是好的,但爲什麼更改地圖效果出用戶結構?
任何理由使用'unsafe',而不是'fmt.Printf( 「%P \ N」,&U)'? – nothingmuch
有趣的是,@nothingmuch實際上用這個用戶名回答他自己的問題! –
因爲只有**地圖** **本身**按值傳遞(並且被複制):地圖的**內容**被地圖的所有副本共享。因此,地圖 - 正式被複制並通過值傳遞 - 就像它是一個引用類型一樣。 – Volker