Heim >Backend-Entwicklung >Golang >Warum bevorzugt das „fmt'-Paket von Go „Error()' gegenüber „String()', wenn beide implementiert sind?

Warum bevorzugt das „fmt'-Paket von Go „Error()' gegenüber „String()', wenn beide implementiert sind?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-28 10:58:11165Durchsuche

Why Does Go's `fmt` Package Prefer `Error()` Over `String()` When Both Are Implemented?

Error() Priority Over String() in Go

In Go verarbeitet das fmt-Paket Druckwerte basierend auf ihrem Typ. Wenn ein Objekt sowohl die Methoden Error() als auch String() implementiert, hat die Methode Error() Vorrang. Dieses Verhalten ist auf die Implementierung von fmt zurückzuführen, das die Fehlerbehandlung priorisiert.

Laut der fmt-Paketdokumentation wird, wenn ein Operand die Fehlerschnittstelle implementiert, zuvor die Methode Error() aufgerufen, um das Objekt in einen String zu konvertieren Anwenden einer beliebigen Formatierung. Diese Logik überschreibt die String()-Methode, die standardmäßig für Operanden aufgerufen wird, die sie implementieren.

Der folgende Code demonstriert dieses Verhalten:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p *Person) String() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

func (p *Person) Error() string {
    return fmt.Sprintf("Failed")
}

func main() {
    a := &Person{"Arthur Dent", 42}
    z := &Person{"Zaphod Beeblebrox", 9001}
    fmt.Println(a, z)
}

Ausgabe:

Failed Failed

Obwohl in diesem Beispiel der Typ Person sowohl String() als auch Error() implementiert, wird die Funktion fmt.Println gedruckt „Fehlgeschlagen“ für beide Personen, da die Methode Error() Vorrang hat. Dies liegt daran, dass Fehler als kritischer gelten und sofortige Aufmerksamkeit erfordern.

Das obige ist der detaillierte Inhalt vonWarum bevorzugt das „fmt'-Paket von Go „Error()' gegenüber „String()', wenn beide implementiert sind?. 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