Direktes Ändern von Feldern in einer Strukturkarte in Go
In Go ermöglicht Ihnen eine Karte von int zu struct den Zugriff auf die Strukturwerte mit dem Schlüssel. Das direkte Ändern eines Felds im Strukturwert kann jedoch zu unerwartetem Verhalten führen.
Grund für die Indirektion
Wenn Sie über die Karte auf den Strukturwert zugreifen, ist dies tatsächlich der Fall Zugriff auf eine Kopie der Struktur. Durch das Ändern dieser Kopie wird die ursprüngliche Struktur in der Karte nicht geändert. Um die ursprüngliche Struktur zu ändern, müssen Sie sie lesen, ändern und dann zurück in die Karte schreiben.
Das liegt daran, dass Go den Strukturwert an einem separaten Speicherort speichert, wenn er der Karte zugewiesen wird . Das Ändern der Kopie hat keinen Einfluss auf den ursprünglichen Wert.
Implizite versteckte Kosten
Es gibt keine impliziten versteckten Kosten beim Ändern von Feldern von Strukturen in anderen Datenstrukturen wie Slices oder Karten . Das Verhalten ist das gleiche wie im Fall einer Zuordnung von Ints zu Strukturen, bei der Änderungen an einer Kopie der Struktur keine Auswirkungen auf das Original haben.
Verwendung von Zeigern
Sie können Zeiger verwenden, um den ursprünglichen Strukturwert an Ort und Stelle zu ändern. Indem Sie den Zeiger auf die Struktur anstelle der Struktur selbst in der Karte speichern, können Sie direkt auf die Felder der ursprünglichen Struktur zugreifen und diese ändern.
Beispiel:
import "fmt" type dummy struct { a int } func main() { x := make(map[int]*dummy) x[1] = &dummy{a: 1} x[1].a = 2 fmt.Println(x[1].a) // Output: 2 }
In diesem Beispiel greifen wir über einen Zeiger auf den Strukturwert zu, sodass wir seine Felder direkt ändern können.
Das obige ist der detaillierte Inhalt vonWie kann ich Strukturfelder innerhalb einer Go-Map korrekt ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!