Unvorhergesehene String()-Methodeninteraktionen in eingebetteten Go-Typen
Das Verständnis der Nuancen des Verhaltens der String()-Methode in Go ist bei der Arbeit von entscheidender Bedeutung mit eingebetteten Typen. Betrachten Sie den folgenden Codeausschnitt:
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) }
Die Ausgabe dieses Codes ist „Name: John Doe, Alter: 35 3 Konstruktion.“ Dieses zunächst rätselhafte Verhalten lässt sich erklären, indem man untersucht, wie eingebettete Typen mit der String()-Methode interagieren.
Embedded Type Promotions
In Go ermöglichen eingebettete Typen die Einbeziehung von Feldern und Methoden anderer Typen. Wenn ein Typ einen anderen Typ einbettet, werden die Felder und Methoden des eingebetteten Typs zum Einbettungstyp hochgestuft und verhalten sich so, als wären sie für den Einbettungstyp definiert. In unserem Beispiel bettet der Typ „Ingenieur“ sowohl die Typen „Person“ als auch „TaxPayer“ ein.
Methodenauswahl
Wenn die String()-Methode für einen eingebetteten Typ aufgerufen wird, ist das Standardverhalten besteht darin, die flachste (am wenigsten tief verschachtelte) Methode mit diesem Namen auszuwählen. Wenn jedoch mehrere hochgestufte String()-Methoden in derselben Tiefe vorhanden sind, wird der Selektorausdruck ungültig, was zu einem Fehler bei der Kompilierung führt.
Im bereitgestellten Code verfügen sowohl die Typen Person als auch TaxPayer über String() Methoden. Daher ist Engineer.String() ein illegaler Selektor. Daher wird beim Drucken des Engineer-Werts keine der String()-Methoden direkt aufgerufen.
fmt Package String Generation
Wenn kein expliziter String() vorhanden ist Wenn Sie eine für einen Strukturtyp definierte Methode verwenden, greift das FMT-Paket auf die Standardzeichenfolgendarstellung zurück, die auch das Drucken der Feldwerte umfasst. In der Struktur „Ingenieur“ führt dies zu der Ausgabe „Name: John Doe, Alter: 35 3 Konstruktion“.
Auswirkung der Entfernungsmethoden
Interessanterweise wird eine der beiden Personen entfernt .String() oder TaxPayer.String() lösen die Mehrdeutigkeit auf, sodass die verbleibende String()-Methode für die String-Generierung verwendet werden kann. Dies unterstreicht, wie wichtig es ist, bei der Verwendung eingebetteter Typen die Namenskonventionen für Methoden sorgfältig zu berücksichtigen.
Fazit
Das Verhalten der String()-Methode bei eingebetteten Typen unterstreicht die Notwendigkeit von Klarheit und Weitblick bei der Methodendefinition. Durch das Verständnis der Mechanismen der Methodenauswahl und -förderung können Entwickler mehrdeutige Selektoren vermeiden und eine konsistente Zeichenfolgendarstellung ihrer Typen sicherstellen.
Das obige ist der detaillierte Inhalt vonWie verhält sich die „String()'-Methode von Go mit eingebetteten Typen und mehreren heraufgestuften Methoden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!