Heim > Artikel > Backend-Entwicklung > Warum verwendet fmt.Println in Go nicht die Member-String()-Methoden einer Struktur?
Verstehen des Verhaltens von fmt.Println mit Strukturmitgliedern
Wenn wir in Go fmt.Println für eine Struktur aufrufen, erwarten wir eine Ausgabe die String-Darstellung der Mitglieder der Struktur unter Verwendung ihrer jeweiligen String()-Methoden. Dies ist jedoch nicht immer der Fall.
Betrachten Sie den folgenden Code:
package main import ( "fmt" ) type bar struct { } func (b bar) String() string { return "bar" } type foo struct { b []*bar bb *bar } func main() { f := foo{b: []*bar{&bar{}}, bb: &bar{}} fmt.Println(f, f.b, f.bb) }
In diesem Code definieren wir einen Balkentyp mit einer String()-Methode, die die Zeichenfolge „bar ." Wir definieren auch einen foo-Typ mit den Feldern b und bb, die Slices bzw. Zeiger auf Balkentypen sind.
Wenn wir fmt.Println für f, f.b und f.bb aufrufen, erhalten wir die folgende Ausgabe :
{[0x176f44] 0x176f44} [bar] bar
Das unterscheidet sich von dem, was wir erwarten würden, nämlich:
{[bar] bar} [bar] bar
Gründe Hinter dem Verhalten von fmt.Println
Es gibt einige Gründe, warum fmt.Println die String()-Methode von Mitgliedern nicht verwendet, wenn sie für eine Struktur aufgerufen wird:
Lösung
Um dies zu beheben, müssen wir sicherstellen, dass Die String()-Methode und die Felder in der Struktur werden exportiert. Hier ist der korrigierte Code:
package main import ( "fmt" ) type Bar struct { } func (b Bar) String() string { return "bar" } type Foo struct { B []Bar BB Bar } func main() { f := Foo{B: []Bar{Bar{}}, BB: Bar{}} fmt.Println(f) }
Wenn wir nun den Code ausführen, erhalten wir die erwartete Ausgabe:
{[bar] bar} [bar] bar
Das obige ist der detaillierte Inhalt vonWarum verwendet fmt.Println in Go nicht die Member-String()-Methoden einer Struktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!