使用 fmt.Println 调用 String() 打印对象
在处理 fmt.Println 和 Stringer 接口时,了解类型转换过程至关重要。
在提供的代码中,处理指针时会调用 Car.String(),但在使用值时则不然。这是因为 fmt.Println 将指针和值强制转换为 interface{} 类型。
fmt 然后执行类型切换以确定如何打印该值。对于实现 fmt.Stringer 的值(使用返回字符串的 String 方法),它会打印该方法的结果。但是,对于在指针类型上定义了 String 方法的值,类型切换会失败。
解决方案:
要解决此问题,请在 Car 类型上实现 String或者传递一个指向 fmt.Println 的指针,如下所示:
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) // Passing the pointer explicitly }
或者,您可以使用自定义类型断言手动调用 String,但不推荐这种方法:
func main() { myCar := Car{year: 1996, make: "Toyota"} if v, ok := myCar.(fmt.Stringer); ok { fmt.Println(v.String()) // Manually invoking String } }
通过解决 fmt.Println 的类型转换行为,您可以有效地控制对象的格式化方式,无论其值或指针性质如何。
以上是为什么 fmt.Println 为指针调用 Car.String() 而不是值?的详细内容。更多信息请关注PHP中文网其他相关文章!