ich ein neues bin auf go.Now Ich habe eine Frage zu functoin variable.Here Pass ist der Code:golang andere func Änderung Karte eines struct
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"
}
Code oben Ausgang:
before --------
0xc04203a4c0
0xc04203a4d0
{Leto map[]}
in func --------
0xc04203a500
0xc04203a510
after --------
{Leto map[t:t]}
in Modify func ich weiß, Benutzer ist eine Kopie, so ändern Sie den Namen nicht funktionieren ist in Ordnung, aber warum Map-Effekt aus Benutzer struct ändern?
Gibt es Gründe, 'unsafe' verwenden anstelle von' fmt.Printf ("% p \ n", & u) '? – nothingmuch
Interessanterweise beantwortet @nothingmuch tatsächlich seine eigene Frage mit diesem Benutzernamen! –
Da nur die ** Map ** ** selbst ** nach Wert übergeben (und kopiert) wird: Der ** Inhalt ** der Map wird von allen Kopien der Map gemeinsam genutzt. So verhält sich eine Karte - während sie formal kopiert und nach Wert übergeben wird - als wäre sie ein Referenztyp. – Volker