Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verhält sich die „String()'-Methode von Go mit eingebetteten Typen und mehreren heraufgestuften Methoden?

Wie verhält sich die „String()'-Methode von Go mit eingebetteten Typen und mehreren heraufgestuften Methoden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-21 12:59:13784Durchsuche

How Does Go's `String()` Method Behave with Embedded Types and Multiple Promoted Methods?

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!

Stellungnahme:
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