fmt.Println- und String()-Methoden
Warum verwendet fmt.Println nicht die String()-Methoden von Mitgliedern, wenn es aufgerufen wird? eine Struktur? Lassen Sie uns den zugrunde liegenden Mechanismus untersuchen.
Betrachten Sie den folgenden Code:
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) }
Dieser Code erzeugt die erwartete Ausgabe:
{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
Sie fragen sich jedoch möglicherweise, warum die Ausgabe ist nicht wie folgt:
{[bar] bar} [bar] bar
was die String()-Darstellung der Mitglieder anstelle von Speicheradressen anzeigen würde.
Der Grund liegt in der nicht exportierten Natur sowohl des Bar-Typs als auch seiner String()-Methode. In Go kann auf nicht exportierte Mitglieder und Methoden nur innerhalb des Pakets zugegriffen werden, in dem sie definiert sind. Da fmt.Println nicht Teil desselben Pakets ist, kann es nicht auf diese nicht exportierten Elemente zugreifen. Daher greift es auf das Standardverhalten des Druckens von Speicheradressen für nicht integrierte Typen zurück.
Um dieses Problem zu beheben, müssen Sie sowohl den Bar-Typ als auch seine String()-Methode exportieren. Darüber hinaus müssen auch die Felder in der Foo-Struktur für die ordnungsgemäße JSON-Kodierung und -Dekodierung exportiert werden.
Hier ist eine modifizierte Version des Codes, die den richtigen Ansatz demonstriert:
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) }
Mit diesen Änderungen implementiert, lautet die Ausgabe nun:
{[bar] bar} [bar] bar
Dieses Beispiel verdeutlicht die Bedeutung der Verwendung exportierter Typen und Methoden für eine angemessene Integration mit Formatierern wie fmt.Println.
Das obige ist der detaillierte Inhalt vonWarum verwendet „fmt.Println' nicht die „String()'-Methode einer Struktur, es sei denn, die Struktur und die Methode werden exportiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!