Heim > Backend-Entwicklung > Golang > Warum verwendet „fmt.Println' nicht die „String()'-Methode einer Struktur, es sei denn, die Struktur und die Methode werden exportiert?

Warum verwendet „fmt.Println' nicht die „String()'-Methode einer Struktur, es sei denn, die Struktur und die Methode werden exportiert?

Barbara Streisand
Freigeben: 2024-11-19 17:50:03
Original
1075 Leute haben es durchsucht

Why doesn't `fmt.Println` use a struct's `String()` method unless the struct and method are exported?

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)
}
Nach dem Login kopieren

Dieser Code erzeugt die erwartete Ausgabe:

{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
Nach dem Login kopieren

Sie fragen sich jedoch möglicherweise, warum die Ausgabe ist nicht wie folgt:

{[bar] bar} [bar] bar
Nach dem Login kopieren
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Mit diesen Änderungen implementiert, lautet die Ausgabe nun:

{[bar] bar} [bar] bar
Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage