Das seltsame Verhalten von Schnittstellentypen in Go verstehen
In Go definieren Schnittstellen Verträge, die es verschiedenen Typen ermöglichen, sich ähnlich zu verhalten. Bei der Verwendung von Schnittstellen mit benutzerdefinierten Methoden kann es jedoch zu unerwartetem Verhalten kommen, wie im folgenden Beispiel dargestellt:
type T int func (t T) Error() string { return "bad error" } func main() { var v interface{} = T(5) fmt.Println(v) // Output: "bad error" }
Warum gibt der obige Code den Wert von T(5) nicht wie erwartet aus? Der Grund liegt in der Art und Weise, wie Go mit Schnittstellen und deren Methoden interagiert.
fmt.Println und der %v-Formatierer
Die Funktion fmt.Println verwendet den %v-Formatierer um den Wert einer Schnittstelle auszugeben. Laut Dokumentation wird, wenn ein Operand die Fehlerschnittstelle implementiert, seine Error-Methode aufgerufen, um das Objekt in eine Zeichenfolge umzuwandeln.
In unserem Fall implementiert T die Fehlerschnittstelle mit einer benutzerdefinierten Error-Methode, die „ schlimmer Fehler". Wenn fmt.Println mit v (einem Schnittstellenwert vom Typ T) aufgerufen wird, verwendet es die Error-Methode, um seine Zeichenfolgendarstellung zu generieren. Aus diesem Grund sehen wir als Ausgabe „schlechter Fehler“ anstelle des Werts 5.
Benutzerdefinierte Formatierung
Um dieses unerwartete Verhalten zu vermeiden, können Sie eine benutzerdefinierte Formatierung von verwenden Übergeben einer Formatzeichenfolge an fmt.Printf. Zum Beispiel:
fmt.Printf("%d", v) // Output: "5"
Dies weist fmt.Printf explizit an, den Wert von v als dezimale Ganzzahl auszugeben und dabei die Standardformatierung %v zu überschreiben.
Fazit
Zu verstehen, wie Go mit Schnittstellen und dem %v-Formatierer interagiert, ist entscheidend, um unerwartetes Verhalten beim Umgang mit benutzerdefinierten Methoden und zu vermeiden Formatierung. Beachten Sie, dass die Error-Methode einer Fehlerschnittstelle das Ergebnis von fmt.Println beeinflussen kann, und verwenden Sie bei Bedarf benutzerdefinierte Formatierungen, um die gewünschte Ausgabe sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum gibt „fmt.Println' „schlechter Fehler' anstelle von 5 aus, wenn eine Go-Schnittstelle mit einer benutzerdefinierten „Fehler'-Methode verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!