Heim > Backend-Entwicklung > Golang > Warum ruft fmt.Println Car.String() für Zeiger, aber nicht für Werte auf?

Warum ruft fmt.Println Car.String() für Zeiger, aber nicht für Werte auf?

Linda Hamilton
Freigeben: 2024-12-07 06:42:14
Original
399 Leute haben es durchsucht

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

Aufgerufene String() zum Drucken von Objekten mit fmt.Println

Verstehen Sie beim Umgang mit fmt.Println- und Stringer-Schnittstellen den Typkonvertierungsprozess ist von entscheidender Bedeutung.

Im bereitgestellten Code wird Car.String() bei der Verarbeitung von Zeigern aufgerufen, nicht jedoch bei der Verwendung von Werten. Dies liegt daran, dass fmt.Println sowohl Zeiger als auch Werte in einen Interface{}-Typ umwandelt.

fmt führt dann einen Typwechsel durch, um zu bestimmen, wie der Wert gedruckt wird. Bei Werten, die fmt.Stringer implementieren (wobei eine String-Methode einen String zurückgibt), wird das Ergebnis dieser Methode ausgegeben. Bei Werten mit einer String-Methode, die für den Zeigertyp definiert ist, schlägt der Typwechsel jedoch fehl.

Lösung:

Um dieses Problem zu beheben, implementieren Sie entweder String für den Car-Typ oder übergeben Sie einen Zeiger an fmt.Println, wie unten gezeigt:

type Car struct {
    year int
    make string
}

func (c Car) String() string {
    return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    fmt.Println(&myCar) // Passing the pointer explicitly
}
Nach dem Login kopieren

Alternativ können Sie eine benutzerdefinierte Typzusicherung manuell verwenden Rufen Sie String auf, aber dieser Ansatz wird nicht empfohlen:

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}
Nach dem Login kopieren

Durch die Behebung des Typkonvertierungsverhaltens von fmt.Println können Sie effektiv steuern, wie Objekte formatiert werden, unabhängig von ihrem Wert oder ihrer Zeigernatur.

Das obige ist der detaillierte Inhalt vonWarum ruft fmt.Println Car.String() für Zeiger, aber nicht für Werte auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage