首页 > 后端开发 > Golang > 正文

为什么 Go 中 `fmt.Println` 优先考虑 `Error()` 而不是 `String()`?

DDD
发布: 2024-11-20 20:09:16
原创
524 人浏览过

Why Does `fmt.Println` Prioritize `Error()` over `String()` in Go?

fmt.Println 中 Error() 相对于 String() 的优先级

在 Go 中,当使用 fmt.Println 打印对象时, String () 方法通常用于将对象转换为字符串以进行打印。但是,在某些情况下,Error() 方法优先于 String()。

此行为是由 fmt.Println 的实现定义的。包文档指出,如果一个对象实现了错误接口,则将调用 Error() 方法将该对象转换为字符串。然后根据动词(如果有)的要求格式化该字符串。

Error() 的实现比 String() 具有更高的优先级,因为在实践中错误被认为更重要。这可以确保清楚地显示任何错误,即使定义了自定义 String() 方法也是如此。

为了说明此概念,请考虑以下示例:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p *Person) String() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

func (p *Person) Error() string {
    return fmt.Sprintf("Failed")
}

func main() {
    a := &Person{"Arthur Dent", 42}
    z := &Person{"Zaphod Beeblebrox", 9001}
    fmt.Println(a, z)
}
登录后复制

在此示例中,两者Person 类型实现 String() 和 Error() 方法。但是,当使用 fmt.Println 打印对象时,会调用 Error() 方法而不是 String(),从而导致以下输出:

Failed Failed
登录后复制

这是因为 Error() 的优先级高于fmt.Println 中的 String(),确保清晰显示任何错误。

因此,在使用同时实现 Error() 和 String() 的对象时,考虑所需的输出并调整相应实施。

以上是为什么 Go 中 `fmt.Println` 优先考虑 `Error()` 而不是 `String()`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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