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

WBOY
Freigeben: 2024-02-09 11:48:19
nach vorne
987 Leute haben es durchsucht

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
}
Nach dem Login kopieren

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)
    
    ...
}
Nach dem Login kopieren

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

return path, errors.New("bar")
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!