Heim  >  Artikel  >  Backend-Entwicklung  >  Wie funktioniert das Schlüsselwort „defer“ in Go und welches Problem löst es in diesem Codebeispiel?

Wie funktioniert das Schlüsselwort „defer“ in Go und welches Problem löst es in diesem Codebeispiel?

DDD
DDDOriginal
2024-10-31 16:20:02596Durchsuche

How does the defer keyword work in Go and what problem does it solve in this code example?

So funktioniert das Schlüsselwort „Defer“ in Go

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.

Auswertungsreihenfolge

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.

Beispiel aus der Praxis

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.

Eine Feature-Implementierung aufschieben

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.

Lösung des Problems

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!

Stellungnahme:
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