Предположим, у меня есть следующий код:
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)
}
Когда я вызываю fmt.Println(myCar) и рассматриваемый объект является указателем, мой метод String() вызывается правильно. Однако, если объект является значением, мой вывод форматируется с использованием стандартного форматирования, встроенного в Go, и мой код для форматирования указанного объекта не вызывается.
Интересно, что в любом случае, если я вызываю myCar.String() вручную, он работает правильно, независимо от того, является ли мой объект указателем или значением.
Как мне отформатировать мой объект так, как я хочу, независимо от того, основан ли объект на значениях или указателях при использовании с Println?
Я не хочу использовать метод значения для String, потому что тогда это означает, что каждый раз, когда он вызывал объект, копируется, что кажется неразумным. И я не хочу, чтобы мне всегда приходилось вручную вызывать .String(), потому что я пытаюсь, чтобы система типизации уток работала.