Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich die Adresse eines Kartenwerts in Go nicht übernehmen?

Warum kann ich die Adresse eines Kartenwerts in Go nicht übernehmen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-16 07:24:02435Durchsuche

Why can't I take the address of a map value in Go?

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:

  1. Rufen Sie den Strukturwert aus der Karte ab.
  2. Ändern Sie den Strukturwert.
  3. Speichern Sie den geänderten Strukturwert wieder in der Karte.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn