In Go wird das Schlüsselwort „defer“ verwendet, um die Ausführung eines Funktionsaufrufs zu verzögern, bis die umgebende Funktion zurückkehrt. Die Parameter und der Funktionswert des verzögerten Aufrufs werden wie üblich ausgewertet, wenn die Defer-Anweisung ausgeführt wird, aber die eigentliche Funktion wird unmittelbar vor der Return-Anweisung der umgebenden Funktion aufgerufen.
Die Auswertung Die Reihenfolge der Anweisungen mit dem Schlüsselwort defer folgt einem Last-In-First-Out-Ansatz (LIFO). Betrachten Sie beispielsweise den folgenden Code:
<code class="go">defer func1()() defer func2()() fmt.Println("main function")</code>
In diesem Beispiel wird der Aufruf von func1() verzögert und unmittelbar vor der Rückkehr der Hauptfunktion ausgeführt. Ebenso wird der Aufruf von func2() zurückgestellt und vor dem Aufruf von func1() ausgeführt.
Ein häufiger Anwendungsfall für „Defer“ ist die automatische Freigabe von Ressourcen vor einem Funktion kehrt zurück. Beispielsweise kann ein Dateihandle am Anfang einer Funktion geöffnet und mit „defer“ geschlossen werden, bevor die Funktion zurückkehrt.
Betrachten Sie das Beispiel im Problem:
<code class="go">defer fmt.Println("Your age is:", getAge(age)) // calls getAge defer fmt.Println("Your ticket price is:", printTicket(age, ticketprice)) // calls printTicket</code>
In diesem Code wird der Aufruf von getAge() vor dem Aufruf von printTicket() verzögert. Dies bedeutet, dass die Auswertung des Alters und die Berechnung des Ticketpreises sofort erfolgen, während das tatsächliche Drucken des Alters und des Ticketpreises verzögert wird, bis die Funktion zurückkehrt.
Durch die Verwendung von defer können Sie sicherstellen, dass das Alter und Ticketpreis werden immer gedruckt, auch wenn während der Funktionsausführung ein Fehler auftritt.
Der ursprüngliche Code im Problem hatte ein Problem, bei dem die printTicket-Funktion nicht aufgerufen wurde korrekt für Altersgruppen über 13 Jahren. Dies lag daran, dass die Variable „ticketPrice“ deklariert, aber nie ein Wert zugewiesen wurde. Durch die Verwendung von „Defer“ können wir sicherstellen, dass der Ticketpreis korrekt berechnet wird, bevor er gedruckt wird.
Hier ist eine korrigierte Version des Codes:
<code class="go">package main import "fmt" func main() { var age int defer fmt.Println("Your age is:", getAge(&age)) defer fmt.Println("Your ticket price is:", printTicket(age)) } func printTicket(age int) float64 { var ticketPrice float64 switch { case age <= 13: ticketPrice = 9.99 case age > 13 && age < 65: ticketPrice = 19.99 case age >= 65: ticketPrice = 12.99 } return ticketPrice } func getAge(age *int) int { fmt.Println("What is your age?") fmt.Scan(age) for *age < 0 || *age > 100 { fmt.Println("That cannot be, please enter your age again") fmt.Scan(age) } return *age }</code>
Mit diesem Fix wird der Code korrekt Drucken Sie den Ticketpreis basierend auf dem Alter des Benutzers aus.
Das obige ist der detaillierte Inhalt vonWie funktioniert das Schlüsselwort „defer' in Go und welches Problem löst es in diesem Codebeispiel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!