Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verwendet fmt.Println in Go nicht die Member-String()-Methoden einer Struktur?

Warum verwendet fmt.Println in Go nicht die Member-String()-Methoden einer Struktur?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-23 07:47:27915Durchsuche

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

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:

  • String()-Methode wird nicht exportiert: Die String()-Methode im Balkentyp wird nicht exportiert, da sie mit einem Kleinbuchstaben beginnt. Auf exportierte Typen und Methoden kann von anderen Paketen aus zugegriffen werden, auf nicht exportierte jedoch nicht.
  • Felder werden nicht exportiert: Die Felder b und bb im Typ foo werden ebenfalls nicht exportiert, da sie mit Kleinbuchstaben beginnen . Daher kann nicht von anderen Paketen aus auf sie zugegriffen werden und sie werden nicht von fmt.Println gedruckt.

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!

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