Heim >Backend-Entwicklung >Golang >Warum gibt fmt.Println „bad error' anstelle von 5 aus, wenn ein benutzerdefinierter Typ die Go-Error-Schnittstelle implementiert?

Warum gibt fmt.Println „bad error' anstelle von 5 aus, wenn ein benutzerdefinierter Typ die Go-Error-Schnittstelle implementiert?

Barbara Streisand
Barbara StreisandOriginal
2024-12-22 11:37:13117Durchsuche

Why Does fmt.Println Print

Verstehen des Verhaltens von Go-Schnittstellen für die Fehlerbehandlung

In der Programmiersprache Go stellen Schnittstellen einen leistungsstarken Mechanismus zum Definieren von Verträgen zwischen Typen bereit. Ein solcher Vertrag ist die Schnittstelle „Error“, die es Typen ermöglicht, Fehler darzustellen. In diesem Artikel wird ein bestimmtes Szenario untersucht, in dem die Definition einer „Error“-Methode für einen benutzerdefinierten Typ zu einer unerwarteten Ausgabe führt.

Das Problem:

Bedenken Sie den folgenden Codeausschnitt:

type T int

func (t T) Error() string {
    return "bad error"
}

func main() {
    var v interface{} = T(5)
    fmt.Println(v) //output: bad error, not 5
}

Wenn Sie diesen Code ausführen, lautet die Ausgabe „schlechter Fehler“ anstelle des erwarteten Ganzzahlwerts 5. Warum ist das so? passiert?

Die Antwort:

Dieses Verhalten kann erklärt werden, indem man versteht, wie fmt.Println mit Werten umgeht. Wenn ein Operand die „Error“-Schnittstelle implementiert, wird laut der fmt-Paketdokumentation seine Error-Methode aufgerufen, um das Objekt zum Drucken in eine Zeichenfolge umzuwandeln. Da der benutzerdefinierte Typ T diese Schnittstelle implementiert, gibt seine Fehlermethode „schlechter Fehler“ zurück, der anstelle des ganzzahligen Werts gedruckt wird.

Die Lösung:

Zum Drucken Wenn Sie den ganzzahligen Wert von T angeben möchten, können Sie die Funktion fmt.Printf mit dem entsprechenden Formatbezeichner verwenden. Zum Beispiel:

fmt.Printf("%d", v) //output: 5

Alternativ können Sie eine benutzerdefinierte String()-Methode für Typ T definieren, um das Ausgabeformat zu steuern, wenn fmt.Println verwendet wird:

type T int

func (t T) String() string {
    return strconv.Itoa(int(t))
}

func main() {
    var v interface{} = T(5)
    fmt.Println(v) //output: 5
}

Das obige ist der detaillierte Inhalt vonWarum gibt fmt.Println „bad error' anstelle von 5 aus, wenn ein benutzerdefinierter Typ die Go-Error-Schnittstelle implementiert?. 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