Heim > Backend-Entwicklung > Golang > Warum verhält sich „fmt.Println()' bei eingebetteten Typen in Go anders, wenn die eingebetteten Typen widersprüchliche „String()'-Methoden haben?

Warum verhält sich „fmt.Println()' bei eingebetteten Typen in Go anders, wenn die eingebetteten Typen widersprüchliche „String()'-Methoden haben?

Patricia Arquette
Freigeben: 2024-11-30 07:28:11
Original
389 Leute haben es durchsucht

Why does `fmt.Println()` behave differently with embedded types in Go when the embedded types have conflicting `String()` methods?

Mehrdeutiges Verhalten der String()-Methode mit eingebetteten Typen in Go

Beim Umgang mit eingebetteten Typen in Go das Verhalten des Strings verstehen ()-Methode kann rätselhaft sein. Lassen Sie uns dieses Verhalten anhand eines bestimmten Codebeispiels untersuchen.

Betrachten Sie den folgenden Code:

type Engineer struct {
    Person
    TaxPayer
    Specialization string
}

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age)
}

type TaxPayer struct {
    TaxBracket int
}

func (t TaxPayer) String() string {
    return fmt.Sprintf("%d", t.TaxBracket)
}

func main() {
    engineer := Engineer{
        Person: Person{
            Name: "John Doe",
            Age:  35,
        },
        TaxPayer: TaxPayer{3},
        Specialization: "Construction",
    }
    fmt.Println(engineer)
}
Nach dem Login kopieren

Die Ausgabe dieses Codes ist:

{name: John Doe, age: 35 3 Construction}
Nach dem Login kopieren

Allerdings Wenn Person.String() entfernt wird, lautet die Ausgabe:

3
Nach dem Login kopieren

Und wenn auch TaxPayer.String() entfernt wird entfernt, ändert sich die Ausgabe zu:

{{John Doe 35} {3} Construction}
Nach dem Login kopieren

Anfangs scheint es, dass es eine implizite String()-Methode für die Engineer-Struktur geben muss. Dies ist jedoch nicht der Fall.

Die String()-Methode in eingebetteten Typen

Wenn Typen in eine Struktur eingebettet sind, werden ihre Felder und Methoden über zugänglich Einbettungstyp. Diese „Heraufstufung“ von Methoden kann zu Mehrdeutigkeiten führen, wenn mehrere eingebettete Typen eine Methode mit demselben Namen definieren, z. B. String().

Im angegebenen Codebeispiel haben sowohl Person als auch TaxPayer einen String() Methode führt die Heraufstufung dieser Methoden zum Typ „Ingenieur“ zu Mehrdeutigkeiten. Aus diesem Grund führt Engineer.String() zu einem Kompilierungsfehler.

Warum kein Mehrdeutigkeitsfehler bei der Verwendung von fmt.Println()

Trotz der Mehrdeutigkeit im Methodensatz von Engineer , fmt.Println(engineer) führt nicht zu einem Kompilierungsfehler. Dies liegt daran, dass fmt.Println() fmt.Fprint(os.Stdout, Engineer) aufruft.

fmt.Fprint() prüft, ob der übergebene Wert die fmt.Stringer-Schnittstelle implementiert, die eine String()-Methode enthält . Wenn dies der Fall ist, wird String() verwendet, um eine Zeichenfolgendarstellung des Werts zu erstellen.

Da weder Person noch TaxPayer fmt.Stringer implementieren, wird in diesem Fall stattdessen die Standardformatierung (Strukturfelder) verwendet. Dies führt zu der Ausgabe, die wir sehen, wenn fmt.Println(engineer) aufgerufen wird.

Fazit

Das Verständnis des Verhaltens eingebetteter Typen und die Förderung ihrer Methoden ist von entscheidender Bedeutung in Go. Wenn mehrere eingebettete Typen eine Methode mit demselben Namen definieren, kann dies zu Mehrdeutigkeiten und damit zu Kompilierungsfehlern führen. Bei Verwendung von fmt.Println() wird jedoch die Standardformatierung verwendet, wenn der übergebene Wert fmt.Stringer.

nicht implementiert

Das obige ist der detaillierte Inhalt vonWarum verhält sich „fmt.Println()' bei eingebetteten Typen in Go anders, wenn die eingebetteten Typen widersprüchliche „String()'-Methoden haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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