Warum ist nicht meine Stringer interface-Methode immer aufgerufen wird? Bei der Verwendung von fmt.Println

Denke, ich habe 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)
}

Wenn ich anrufen fmt.Println(myCar) und das Objekt in Frage ist ein Zeiger, my String () - Methode aufgerufen wird, richtig. Wenn jedoch das Objekt ist ein Wert, meine Ausgabe ist formatiert mit dem Standard-Formatierung eingebaut Gehen und meinen code zum formatieren der Sprach-Objekt nicht aufgerufen.

Das interessante an der Sache ist in jedem Fall, wenn ich rufe myCar.String() manuell funktioniert es einwandfrei, ob mein Objekt ist entweder ein Zeiger oder Wert.

Wie kann ich mein Objekt formatiert, wie ich will, egal ob das Objekt Wert-oder pointer-basiert, wenn verwendet mit Println?

Ich will nicht verwenden ein value-Methode für String-denn dann bedeutet dass, dass jedes mal, wenn es aufgerufen wird, das Objekt wird kopiert, die Nähte nicht zumutbar. Und ich will nicht immer manuell aufgerufen .String() entweder, weil ich versuche, lassen die duck-typing-system tun, es ist Arbeit.

Schreibe einen Kommentar