fmt.Println 中的接口转换导致方法调用失败
尝试使用 fmt.Println 打印自定义类型的值时,该类型的 String() 方法的预期方法调用可能不会发生。当值作为值而不是指针传递时,就会出现此问题。
考虑示例代码:
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) // Value-based object }
在这种情况下,Car 的预期 String() 方法将不会当 fmt.Println 与 Car 类型的值一起使用时被调用。相反,该值将使用默认的 Go 格式化机制进行格式化。
要解决此问题并确保无论对象是值还是指针都调用自定义 String() 方法,可以使用以下选项可用:
fmt.Println(&myCar) // Pointer-based object
通过遵守这些准则,您可以可靠地调用 String() 方法并控制fmt.Println.
中自定义类型的格式化以上是为什么 `fmt.Println` 不总是调用我的自定义类型的 `String()` 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!