首页 > 后端开发 > Golang > 为什么 `fmt.Println` 不总是调用我的自定义类型的 `String()` 方法?

为什么 `fmt.Println` 不总是调用我的自定义类型的 `String()` 方法?

Patricia Arquette
发布: 2024-12-31 11:43:10
原创
430 人浏览过

Why Doesn't `fmt.Println` Always Call My Custom Type's `String()` Method?

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() 方法,可以使用以下选项可用:

  • 在基于值的类型上实现 String():虽然这种方法消除了手动转换的需要,但它由于每次调用 String() 方法时都会复制对象,因此会导致性能损失。
  • 始终将指针传递给 fmt.Println:通过将指针传递给 fmt.Println,Println函数将自动取消引用它并调用基础值的 String() 方法。这可以确保无论对象是值还是指针,都会应用所需的格式:
fmt.Println(&myCar) // Pointer-based object
登录后复制

通过遵守这些准则,您可以可靠地调用 String() 方法并控制fmt.Println.

中自定义类型的格式化

以上是为什么 `fmt.Println` 不总是调用我的自定义类型的 `String()` 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板