Heim >Backend-Entwicklung >Golang >go – Bereinigen Sie Ressourcen nur, wenn eine Funktion kurz davor steht, einen Fehler zurückzugeben

go – Bereinigen Sie Ressourcen nur, wenn eine Funktion kurz davor steht, einen Fehler zurückzugeben

WBOY
WBOYnach vorne
2024-02-09 11:48:191017Durchsuche

go - 仅在函数即将返回错误时清理资源

PHP-Editor Baicao stellt Ihnen eine Technologie vor, um Ressourcen zu bereinigen, wenn eine Funktion kurz davor steht, einen Fehler zurückzugeben – „go“. Diese Technologie kann Entwicklern dabei helfen, die Ressourcenbereinigung beim Schreiben von Code eleganter zu bewältigen. Durch die Verwendung von „go“ können Entwickler die Ressourcenbereinigungslogik über die Defer-Anweisung in eine separate Funktion einfügen, bevor die Funktion einen Fehler zurückgibt, wodurch Redundanz im Code und eine umständliche Fehlerbehandlung vermieden werden. Die Einfachheit und Effizienz der „go“-Technologie machen sie zur ersten Wahl vieler PHP-Entwickler. Werfen wir einen Blick auf ihre Implementierungsprinzipien und Verwendungsmethoden!

Frageninhalt

Angenommen, ich habe eine Funktion, die zuerst ein Verzeichnis erstellt und dann einige weitere Vorgänge wie diesen ausführt:

{
    err := os.Mkdir(path, os.ModePerm)
    ...

    err = doSomething()
    if err != nil {
        return nil, err
    }

    err = doSomethingElse()
    if err != nil {
        return nil, err
    }

    return path, nil
}

Jetzt möchte ich, dass die Funktion in allen Fällen, in denen ein Fehler auftritt, das von ihr erstellte Verzeichnis löscht. Was ist der sauberste Weg?

Eine Möglichkeit besteht darin, jede if 分支中调用 os.removeall ,但这不是一个很好的解决方案。另一种方法是使用 defer-Anweisung einzufügen, sie aber auch auszuführen, wenn kein Fehler vorliegt.

Workaround

Ja, die Verzögerungsfunktion wird immer ausgeführt, aber ob das Verzeichnis dadurch gelöscht wird oder nicht, liegt ganz bei Ihnen.

Verwenden Sie Verzögerungsfunktionen und prüfen Sie auf Fehler. Wenn keine Fehler vorliegen, löschen Sie das Verzeichnis nicht. Verwenden Sie dazu benannte Ergebnisparameter, zum Beispiel:

func foo() (result resulttype, err error) {
    path := "some folder"

    defer func() {
        if err != nil { // this is the result err
            if err2 := os.removeall(path); err2 != nil {
                // handle err2
            }
        }
    }()

    err := os.mkdir(path, os.modeperm)
    
    ...
}

Bitte beachten Sie, dass bei einer expliziten return-Aussage zum Beispiel:

return path, errors.New("bar")

Die obige return 语句首先将值分配给 resulterr-Anweisung weist zunächst result und err Werte zu, sodass Sie diese Werte in der verzögerten Funktion abrufen/sehen können.

Siehe verwandte Inhalte: Wie gebe ich einen Wert in einer in Panik geratenen Go-Funktion zurück?

Das obige ist der detaillierte Inhalt vongo – Bereinigen Sie Ressourcen nur, wenn eine Funktion kurz davor steht, einen Fehler zurückzugeben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen