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:
<code class="go">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} }</code>
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:
<code class="go">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} }</code>
Anstatt den Zeigerwert zu ändern, weist die Funktion in diesem Fall den p-Zeiger einem neuen zu Testen Sie die Struktur mit einem Wert von 4. Da p eine lokale Variable innerhalb von f ist, wirkt sich diese Änderung nicht auf die ursprüngliche i-Struktur in der Hauptfunktion aus und die Ausgabe bleibt 2.
Lösung: Pointed ändern Wert
Um den angezeigten Wert zu ändern, müssen wir den Zeiger dereferenzieren und direkt auf das Strukturmitglied zugreifen:
<code class="go">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 }</code>
Durch die Verwendung von p.Value ändern wir das Wertfeld der ursprünglichen Struktur , was zu einer Ausgabe von 4.
führtDas obige ist der detaillierte Inhalt vonWie wirken sich Zeiger auf die Wertänderung in Go-Funktionen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!