假设我有以下代码:
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 使用 value 方法,因为这意味着每次调用它时都会复制对象,这接缝是不合理的。而且我不想总是手动调用 .String() ,因为我试图让鸭子打字系统完成它的工作。