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) }
Wann Dieser Code wird ausgeführt und erzeugt die folgende Ausgabe:
{name: John Doe, age: 35 3 Construction}
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:
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!