Heim > Backend-Entwicklung > Golang > Warum ruft „fmt.Println' nicht immer die „String()'-Methode meines benutzerdefinierten Typs auf?

Warum ruft „fmt.Println' nicht immer die „String()'-Methode meines benutzerdefinierten Typs auf?

Patricia Arquette
Freigeben: 2024-12-31 11:43:10
Original
412 Leute haben es durchsucht

Why Doesn't `fmt.Println` Always Call My Custom Type's `String()` Method?

Methodenaufruffehler mit Schnittstellenkonvertierung in fmt.Println

Beim Versuch, mit fmt.Println einen Wert eines benutzerdefinierten Typs zu drucken, Der erwartete Methodenaufruf der String()-Methode des Typs erfolgt möglicherweise nicht. Dieses Problem tritt auf, wenn der Wert als Wert und nicht als Zeiger übergeben wird.

Betrachten Sie den Beispielcode:

import "fmt"

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) // Value-based object
}
Nach dem Login kopieren

In diesem Fall funktioniert die erwartete String()-Methode von Car nicht Wird aufgerufen, wenn fmt.Println mit einem Wert vom Typ Car verwendet wird. Stattdessen wird der Wert mit dem standardmäßigen Go-Formatierungsmechanismus formatiert.

Um dieses Problem zu beheben und sicherzustellen, dass die benutzerdefinierte String()-Methode aufgerufen wird, unabhängig davon, ob das Objekt ein Wert oder ein Zeiger ist, stehen Ihnen die folgenden Optionen zur Verfügung sind verfügbar:

  • Implement String() on Value-based Types: Obwohl dieser Ansatz eine manuelle Konvertierung überflüssig macht, verursacht er a Leistungseinbußen aufgrund des Kopierens des Objekts bei jedem Aufruf der String()-Methode.
  • Immer Zeiger an fmt.Println übergeben: Durch die Übergabe eines Zeigers an fmt.Println wird die Println-Funktion ausgeführt dereferenziert es automatisch und ruft die String()-Methode für den zugrunde liegenden Wert auf. Dadurch wird sichergestellt, dass die gewünschte Formatierung angewendet wird, unabhängig davon, ob das Objekt ein Wert oder ein Zeiger ist:
fmt.Println(&myCar) // Pointer-based object
Nach dem Login kopieren

Durch die Einhaltung dieser Richtlinien können Sie die String()-Methode zuverlässig aufrufen und steuern Formatierung benutzerdefinierter Typen in fmt.Println.

Das obige ist der detaillierte Inhalt vonWarum ruft „fmt.Println' nicht immer die „String()'-Methode meines benutzerdefinierten Typs auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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