Seltsamer Methodenaufruf für eingebettete Strukturen in Go: String() verstehen
In Go erben eingebettete Strukturen die Methoden ihrer eingebetteten Typen. Wenn jedoch mehrere eingebettete Typen Methoden mit demselben Namen definieren, entstehen Unklarheiten. Lassen Sie uns dieses Verhalten untersuchen und uns insbesondere auf die String()-Methode konzentrieren.
Im bereitgestellten Beispielcode:
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) }
Wenn die Engineer-Struktur mit fmt.Println(engineer) gedruckt wird, wird die Die Ausgabe variiert je nach Vorhandensein der String()-Methoden in den eingebetteten Typen.
Mit Person.String():
Ohne Person.String():
Ohne beide String() Methoden:
Diese Szenarien verdeutlichen die Tiefenregel und die Mehrdeutigkeitsauflösung für geförderte Methoden in Go. Es stellt sich jedoch die Frage, warum die Mehrdeutigkeit zur Kompilierungszeit nicht erkannt wird, wenn mehrere String()-Methoden mit einer Tiefe von Null vorhanden sind.
Mehrdeutigkeitsselektorprüfung:
Normalerweise tritt beim Versuch, eine Methode mit einem mehrdeutigen Selektor wie „engineer.Foo()“ aufzurufen, ein Fehler bei der Kompilierung auf. Dies ist jedoch bei Methoden mit dem Namen String() nicht der Fall.
Grund:
Beim Drucken eines Werts ohne expliziten Aufruf seiner String()-Methode, der fmt.Println Funktion prüft, ob der Wert fmt.Stringer implementiert. Anschließend wird die implementierte String()-Methode aufgerufen. Da alle Go-Typen standardmäßig implizit Stringer implementieren (https://golang.org/doc/go1.19#fmt), gibt es für jeden Typ immer eine hochgestufte String()-Methode.
Fazit :
Die Mehrdeutigkeit beim Methodenaufruf für eingebettete Strukturen entsteht durch die Tiefenregel und die spezielle Behandlung der String()-Methode zum Drucken von Werten. Durch das Verständnis dieser Regeln und der subtilen Unterschiede bei der Methodenförderung können Entwickler unerwartetes Verhalten vermeiden und die Codeklarheit in Go-Programmen aufrechterhalten.
Das obige ist der detaillierte Inhalt vonWarum erkennt Go keine Mehrdeutigkeit beim Aufruf der String()-Methode für eingebettete Strukturen zur Kompilierungszeit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!