首页 > 后端开发 > Golang > 为什么 fmt.Println 为指针调用 Car.String() 而不是值?

为什么 fmt.Println 为指针调用 Car.String() 而不是值?

Linda Hamilton
发布: 2024-12-07 06:42:14
原创
403 人浏览过

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

使用 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中文网其他相关文章!

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