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?
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) }
Die Ausgabe dieses Codes ist:
{name: John Doe, age: 35 3 Construction}
Allerdings Wenn Person.String() entfernt wird, lautet die Ausgabe:
3
Und wenn auch TaxPayer.String() entfernt wird entfernt, ändert sich die Ausgabe zu:
{{John Doe 35} {3} Construction}
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 implementiertDas 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!