Heim > Backend-Entwicklung > Golang > Warum druckt „defer' in Go den Anfangswert einer Variablen trotz späterer Änderungen?

Warum druckt „defer' in Go den Anfangswert einer Variablen trotz späterer Änderungen?

Linda Hamilton
Freigeben: 2024-12-29 07:01:09
Original
499 Leute haben es durchsucht

Why Does `defer` in Go Print the Initial Value of a Variable Despite Subsequent Changes?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage