Warum erzeugt „fmt.Println' von Go eine unerwartete Ausgabe, wenn Typen mit widersprüchlichen „String()'-Methoden eingebettet werden?

Patricia Arquette
Freigeben: 2024-11-24 09:08:10
Original
296 Leute haben es durchsucht

Why Does Go's `fmt.Println` Produce Unexpected Output When Embedding Types with Conflicting `String()` Methods?

Unerwartetes Verhalten der String()-Methode bei eingebetteten Typen

In Go ermöglicht die Einbettung, dass Typen Felder und Methoden eines anderen Typs in ihre eigene Struktur einschließen. Wenn jedoch mehrere eingebettete Typen eine Methode mit demselben Namen definieren (z. B. String()), können bestimmte Szenarien zu unerwartetem Verhalten führen.

Beachten 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

Wann Dieser Code wird ausgeführt und erzeugt die folgende Ausgabe:

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

Dieses Ergebnis kann verwirrend erscheinen, da in den eingebetteten Typen Person und mehrere String()-Methoden definiert sind Steuerzahler. Die Mehrdeutigkeit wird jedoch durch die folgenden Regeln behoben:

  • Wenn mehrere eingebettete Typen eine String()-Methode definieren, wird sie als „illegaler Selektor“ betrachtet, was bedeutet, dass nicht direkt (durch einen Aufruf des Ingenieurs) auf sie zugegriffen werden kann .String() zum Beispiel).
  • Daher wird keine String()-Methode zum Einbettungstyp (Engineer) heraufgestuft und somit auch die Standardformatierung (Drucken der Feldwerte). verwendet.
  • Wenn das fmt-Paket jedoch versucht, eine Standardzeichenfolgendarstellung für den Engineer-Wert zu erstellen, prüft es, ob der Wert die fmt.Stringer-Schnittstelle implementiert (die über eine String()-Methode verfügt).
  • Da der Person-Typ fmt.Stringer implementiert, wird seine String()-Methode aufgerufen, um die String-Darstellung der Felder (Name und) zu erzeugen Alter).

Durch das Entfernen der Person.String()-Methode oder der TaxPayer.String()-Methode wird die Mehrdeutigkeit behoben, sodass die verbleibende String()-Methode für die Standardformatierung verwendet werden kann.

Die wichtigste Erkenntnis aus diesem Verhalten ist, dass eingebettete Typen ihre String()-Methoden nur dann fördern, wenn eine einzige, eindeutige Methode definiert ist. Wenn mehrere Methoden vorhanden sind, verfügt der Einbettungstyp nicht über eine hochgestufte String()-Methode und es wird die Standardformatierung verwendet.

Das obige ist der detaillierte Inhalt vonWarum erzeugt „fmt.Println' von Go eine unerwartete Ausgabe, wenn Typen mit widersprüchlichen „String()'-Methoden eingebettet werden?. 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