Heim  >  Artikel  >  Backend-Entwicklung  >  Bietet Go eine Standard- oder De-facto-Methode zur Fehlerbehandlung innerhalb einer einzelnen Anweisung (d. h. Inline-Fehlerbehandlung)?

Bietet Go eine Standard- oder De-facto-Methode zur Fehlerbehandlung innerhalb einer einzelnen Anweisung (d. h. Inline-Fehlerbehandlung)?

王林
王林nach vorne
2024-02-09 22:50:10478Durchsuche

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

Bietet die Go-Sprache eine Standard- oder De-facto-Methode zur Fehlerbehandlung innerhalb einer einzelnen Anweisung, d. h. Inline-Fehlerbehandlung? Diese Frage wird oft von vielen Go-Anfängern gestellt. Die Antwort lautet: Ja, die Go-Sprache bietet eine präzise und effektive Möglichkeit, Fehler in einer einzigen Anweisung zu behandeln. In der Go-Sprache können Sie die Kurzdeklarationsform der if-Anweisung in Kombination mit der Multi-Return-Value-Funktion der Funktion verwenden, um eine Inline-Fehlerbehandlung zu implementieren. Dieser Ansatz ist sowohl prägnant als auch flexibel und kann die Lesbarkeit und Wartbarkeit des Codes verbessern. Gleichzeitig bietet die Go-Sprache auch einige Standardbibliotheksfunktionen und Fehlerbehandlungsfunktionen zur Bewältigung komplexerer Fehlerszenarien. Im Allgemeinen bietet die Go-Sprache eine vollständige und benutzerfreundliche Methode zur Behandlung von Fehlern in einer einzelnen Anweisung.

Frageninhalt

In Rust gibt Result 类型可以被认为是 Go 中的 (val, err) 模式,可以在它出现的语句中立即“展开”,并且不需要专用多行的复杂性到这个任务。例如,假设我们有一个函数 foo eine Zahl oder einen Fehler zurück. In Rust kann die Behandlung dieses Fehlers (ohne ihn zu ignorieren) so einfach sein wie:

let x = foo().unwrap() + 1;

In Go scheint der empfohlene Ansatz zu sein:

x, err := Foo()
if err != nil {
    panic(err)
}
x = x + 1

Bietet Go eine Standard Möglichkeit, Fehler sofort in einer einzigen Anweisung zu behandeln, wie es Rust tut? Oder sollte ich bei einer selbst entwickelten Lösung bleiben?

Meine vorübergehende Lösung ist:

func unwrap[T any](val T, err error) T {
    if err != nil {
        panic(err)
    } else {
        return val
    }
}

Ich bin ein wenig überrascht über die übermäßige Mäßigung. Bei keiner der fünf verlinkten Fragen handelt es sich um Duplikate, und keine davon beantwortet speziell meine Frage. Einige scheinen sogar völlig unabhängig zu sein. Ich denke, das liegt daran, dass mein Titel falsch formuliert war. Ich habe den Titel umformuliert, damit er besser zu meinem eigentlichen Problem passt. Zum Glück hat u/norbjd meine Frage angemessen beantwortet.

Workaround

Wie @mkopriva in den Kommentaren sagte, gibt es in Go keine integrierte Möglichkeit, dies zu tun. Allerdings findet man dieses Muster in vielen Bibliotheken unter dem Namen Must:

Es gibt einen öffentlichen Vorschlag auf Go, eine allgemeine must.DoMethode hinzuzufügen, aber es gibt noch keinen konkreten Inhalt.

Der derzeit empfohlene Ansatz besteht darin, Generics zu verwenden, um Must Methoden in Ihrem Code zu definieren (ab Go 1.18), wie Sie es tun:

func Must[T any](v T, err error) T {
    if err != nil {
        panic(err)
    }
    return v
}

und verwende es so:

import (
    "errors"
    "fmt"
)

func Foo() (int, error) {
    return 1, nil
}

func Bar() (int, error) {
    return 0, errors.New("some error")
}

func main() {
    foo := Must(Foo())
    fmt.Println(foo)
    bar := Must(Bar()) // this will panic with "some error"
    fmt.Println(bar)
}

Es gibt Versuche, Bibliotheken zu erstellen, um diese Methode bereitzustellen, wie zum Beispiel wingyplus/must, aber wie das Repo hervorhebt, basieren sie auf der Go-Philosophie:

Sie können also in jedem Projekt Ihre eigenen Methoden definieren oder diese Art von Bibliotheken verwenden, bis Must in die Go-Standardbibliothek integriert ist (falls dies jemals der Fall ist).

Das obige ist der detaillierte Inhalt vonBietet Go eine Standard- oder De-facto-Methode zur Fehlerbehandlung innerhalb einer einzelnen Anweisung (d. h. Inline-Fehlerbehandlung)?. 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