Klärung der Verwendung aufschieben
Bei der Arbeit mit Funktionen, die die Ausführung verzögern, ist es wichtig, die Auswertung von Parametern zum Zeitpunkt der Verzögerung zu berücksichtigen. Wie dokumentiert speichert „defer“ den ausgewerteten Funktionswert und die Parameter, wenn die Anweisung ausgeführt wird.
Anfangsansatz
Im bereitgestellten Code wird eine einfache Schleife verwendet Erhöhen Sie eine Variable x. Wenn jedoch die verzögerte Ausführung von fmt.Println(x) ausgeführt wird, wird eine Null ausgegeben, obwohl die Variable x innerhalb der Schleife mehrere Inkremente durchlaufen hat. Dies liegt daran, dass x ausgewertet wird, wenn die Verzögerung ausgeführt wird, und nicht, wenn sie tatsächlich aufgerufen wird.
Alternative Lösungen
1) Anonyme Funktion:
Die Einführung einer anonymen Funktion ermöglicht die Trennung von den Parametern der aktuellen Funktion. Wenn die anonyme Funktion ausgeführt wird, greift sie auf den aktualisierten Wert von x zu und gibt ihn aus.
2) Zeiger:
Mit einem Zeiger zeigt er auf x. Bei der Ausführung der Defer-Anweisung wird x nicht ausgewertet, sondern nur die Adresse von x. Dieser Ansatz erfordert eine Hilfsfunktion, um den Point-Wert manuell zu drucken.
3) Benutzerdefinierter Typ:
Das Erstellen eines benutzerdefinierten Typs mit einer benutzerdefinierten String()-Methode bietet eine hohe -Ebenen-Methode für den Zugriff auf den Wert eines Zeigers. Wenn fmt.Println() mit einem Objekt dieses benutzerdefinierten Typs verwendet wird, ruft es automatisch die String()-Methode auf, um den gewünschten Wert abzurufen.
4) Wrapping:
Das Einschließen von x in ein Slice während der Defer-Anweisung führt zu einem Deskriptor, der auf das zugrunde liegende Array verweist. Wenn das Slice mit fmt.Println() gedruckt wird, wird auf den aktualisierten Wert von x zugegriffen und dieser gedruckt. Durch die Erweiterung auf Arrays oder andere ähnliche Typen wird es möglich, den verwiesenen Inhalt zu drucken.
Das obige ist der detaillierte Inhalt vonWarum druckt „defer' in Go den Anfangswert einer Variablen trotz späterer Änderungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!