Heim >Backend-Entwicklung >Golang >Wie wirken sich Gos „defer'-Anweisungen auf als Eingabeparameter deklarierte Variablen im Vergleich zu benannten Ergebnisparametern aus?
Defer-Verhalten für in Golang unterschiedlich deklarierte Variablen
Funktionen mit benannten Ergebnisparametern verhalten sich bei Verwendung der Defer-Anweisung anders als Funktionen mit Eingabeparametern . In diesem Beispiel untersuchen wir diese Unterschiede:
package main import ( "fmt" ) func c(i int) int { defer func() { i++ }() return i } func c1() (i int) { defer func() { i++ }() return i } func c2() (i int) { defer func() { i++ }() return 2 } func main() { fmt.Println(c(0)) // Prints 0 fmt.Println(c1()) // Prints 1 fmt.Println(c2()) // Prints 3 }
c(i int):
In diesem Fall ist i ein eingehender Parameter. Der Rückgabewert wird ausgewertet, bevor die verzögerte Funktion ausgeführt wird. Daher hat das Erhöhen von i nach der Rückgabe keine Auswirkung.
c1():
Hier ist i der Ergebnisparameter . Die return i-Anweisung weist dem Rückgabewert den Wert von i zu. Allerdings können verzögerte Funktionen Rückgabevariablen ändern. In diesem Fall erhöht die verzögerte Funktion i, was zu einem Rückgabewert von 1 führt.
c2():
Ähnlich wie c1(), die Return-2-Anweisung weist i 2 zu. In diesem Fall wird die verzögerte Funktion jedoch nach der Return-Anweisung ausgeführt, was zu einem Rückgabewert von 3 führt.
Zusammenfassend ist es bei der Arbeit mit benannten Ergebnisparametern in Go wichtig zu bedenken, dass verzögerte Funktionen Änderungen vornehmen können ihre Werte auch nach der return-Anweisung. Dieses Verhalten wird in der Go-Spezifikation ausdrücklich erwähnt und kann bei Bedarf zur Änderung von Rückgabewerten verwendet werden.
Das obige ist der detaillierte Inhalt vonWie wirken sich Gos „defer'-Anweisungen auf als Eingabeparameter deklarierte Variablen im Vergleich zu benannten Ergebnisparametern aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!