Heim >Backend-Entwicklung >Golang >Warum ruft „fmt.Println' meine Stringer-Schnittstellenmethode nicht auf, wenn ein Nicht-Zeiger-Objekt verwendet wird?

Warum ruft „fmt.Println' meine Stringer-Schnittstellenmethode nicht auf, wenn ein Nicht-Zeiger-Objekt verwendet wird?

DDD
DDDOriginal
2024-12-06 08:51:18520Durchsuche

Why Doesn't `fmt.Println` Call My Stringer Interface Method When Using a Non-Pointer Object?

Warum wird meine Stringer-Schnittstellenmethode nicht aufgerufen, wenn ich fmt.Println verwende?

Beim Arbeiten mit der Stringer-Schnittstelle von Go können Benutzer auf Situationen stoßen, in denen ihre String( )-Methode wird nicht aufgerufen, wenn Nicht-Zeiger-Objekte an fmt.Println übergeben werden. Um dieses Verhalten zu beleuchten, untersuchen wir den folgenden Code:

package main

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)
}

Hier definieren wir eine Car-Struktur und implementieren die String()-Methode als Wertmethode. Wenn wir jedoch myCar als Argument an fmt.Println übergeben, wird das Objekt in eine Schnittstelle {} konvertiert. Dies führt dazu, dass das fmt-Paket seine eigene Standardformatierung verwendet und unsere String()-Methode umgeht.

Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Tatsache, dass wir die String()-Methode auf einem Zeigerempfänger (*) implementiert haben. Auto). Wenn ein Wert vom Typ Car übergeben wird, wandelt der Compiler ihn nicht automatisch in einen Zeiger um. Daher kann das fmt-Paket unsere String()-Methode nicht mit dem von uns übergebenen Wert abgleichen.

Stattdessen müssen wir zum Aufrufen unserer String()-Methode beim Übergeben eines Nicht-Zeigerobjekts den Wert manuell in a konvertieren Zeiger mit dem &-Operator:

fmt.Println(&myCar)

Dadurch übergeben wir einen Zeiger auf das Car-Objekt an fmt.Println. Dadurch kann die String()-Methode des Wertempfängers aufgerufen und unsere benutzerdefinierte Formatierung angewendet werden.

Zusammenfassend ist es bei der Arbeit mit der Stringer-Schnittstelle wichtig, daran zu denken, dass die Methode auf dem richtigen Empfänger definiert werden muss Typ. Für Zeiger eignet sich ein Zeigerempfänger, während für Werttypen ein Wertempfänger verwendet werden kann. Wenn die manuelle Übergabe eines Zeigers nicht wünschenswert ist, kann man erwägen, die String()-Methode als Zeigermethode auf die tatsächliche Car-Struktur zu implementieren.

Das obige ist der detaillierte Inhalt vonWarum ruft „fmt.Println' meine Stringer-Schnittstellenmethode nicht auf, wenn ein Nicht-Zeiger-Objekt verwendet wird?. 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