Wertänderung mit Zeigern in Go verstehen
In Go ermöglichen Zeiger den indirekten Zugriff und die Änderung von Werten. Bei der Übergabe an Funktionen ist es jedoch wichtig zu verstehen, wie Zeiger funktionieren.
Bei der Übergabe eines Zeigers an eine Funktion treten zwei Szenarien auf: Wertänderung vs. Zeigerneuzuweisung.
Szenario 1 : Wertänderung
Bedenken Sie diesen Code:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
Hier erhält die Funktion f einen Zeiger auf die Teststruktur. Innerhalb von f wird dem dereferenzierten Zeiger (*p) eine neue Teststruktur mit dem Wert 4 zugewiesen. Dadurch wird die ursprüngliche i-Struktur in der Hauptfunktion effektiv geändert, und die Ausgabe ist 4.
Szenario 2: Neuzuweisung des Zeigers
Jetzt ändern wir den Code leicht:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
Anstatt den Zeigerwert zu ändern, weist die Funktion in diesem Fall den p-Zeiger einer neuen Teststruktur mit dem Wert 4 zu. Da p eine lokale Variable innerhalb von f ist, hat diese Änderung keine Auswirkungen auf Ursprüngliche i-Struktur in der Hauptfunktion, und die Ausgabe bleibt 2.
Lösung: Zeigewert ändern
Um den Zeigerwert zu ändern, müssen wir den Zeiger dereferenzieren und direkt Greifen Sie auf das Strukturmitglied zu:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
Durch die Verwendung von p.Value ändern wir das Wertfeld der ursprünglichen Struktur, was zu einer Ausgabe von 4 führt.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3