Adresse von Kartenwerten in Go übernehmen
Frage: Warum kann ich nicht die Adresse von a übernehmen? Kartenwert?
Hintergrund:
Die Programmiersprache Go beschränkt die Verwendung des Operators „&“, um die Adresse von Kartenwerten zu erhalten. Dieses Verhalten unterscheidet sich von Slice-Werten, die mit „&“ angesprochen werden können.
Klärung von Missverständnissen:
Im Gegensatz zu der Annahme, dass Karten durch Speicherstrukturen gestützt werden Wie Arrays werden sie tatsächlich in dynamischen, sich neu organisierenden Bucket-Strukturen gespeichert. Dies bedeutet, dass Kartenwerte keinen festen Speicherort haben.
Der zugrunde liegende Grund:
Der Hauptgrund, warum Go die Adresserfassung von Kartenwerten verbietet, liegt an der dynamische Natur von Kartendatenstrukturen. Wenn Karteneinträge erstellt, aktualisiert oder gelöscht werden, können die Buckets neu organisiert werden, um Leistung und Speichernutzung zu optimieren. Wenn Adressen für Kartenwerte zulässig wären, würden diese bei diesen Verschiebungen ungültig.
Numerische Änderungen in Karten:
Obwohl Operatoren wie „ “ und „ =“ möglich sind Diese Kurzform wird zum direkten Ändern numerischer Kartenwerte verwendet und führt tatsächlich eine Reihe von Operationen aus, die nicht direkt auf den zugrunde liegenden Wert zugreifen.
Beispiel:
func icandothis() { cmap := make(map[int]complex64) cmap[1] += complex(1, 0) fmt.Println(cmap[1]) }
Das Erweitern der Kurzform zeigt, dass die Operation tatsächlich einen neuen temporären Wert erstellt, um die Addition durchzuführen, und ihn wieder in der Karte speichert:
func icandothis() { cmap := make(map[int]complex64) v := cmap[1] v += complex(1, 0) cmap[1] = v fmt.Println(cmap[1]) }
Ändern von Strukturwerten in Karten:
Im Gegensatz zu numerischen Werten erfordert das Ändern von Strukturwerten in Karten die folgenden Schritte:
Beispiel:
type Complex struct { R float32 I float32 } func (x *Complex) Add(c Complex) { x.R += c.R x.I += c.I } func main() { cmap := make(map[int]Complex) c := cmap[1] c.Add(Complex{1, 0}) cmap[1] = c fmt.Println(cmap[1]) }
Durch Befolgen dieser Schritte kann der Strukturwert geändert werden -Ort, ohne dass seine Adresse erforderlich ist.
Das obige ist der detaillierte Inhalt vonWarum kann ich die Adresse eines Kartenwerts in Go nicht übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!