首页 > 后端开发 > Golang > 当两者都实现时,为什么 Go 的 `fmt` 包更喜欢 `Error()` 而不是 `String()`?

当两者都实现时,为什么 Go 的 `fmt` 包更喜欢 `Error()` 而不是 `String()`?

Mary-Kate Olsen
发布: 2024-11-28 10:58:11
原创
200 人浏览过

Why Does Go's `fmt` Package Prefer `Error()` Over `String()` When Both Are Implemented?

Go 中 Error() 优先于 String()

在 Go 中,fmt 包根据值的类型处理打印值。当对象同时实现 Error() 和 String() 方法时,Error() 方法优先。这种行为源于 fmt 的实现,它优先处理错误。

根据 fmt 包文档,如果操作数实现了 error 接口,则会先调用 Error() 方法将对象转换为字符串应用任何格式。此逻辑会覆盖 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)
}
登录后复制

输出:

Failed Failed
登录后复制

在此示例中,即使 Person 类型同时实现了 String() 和 Error(), fmt.Println 函数为两个人打印“失败”,因为 Error() 方法优先。这是因为错误被认为更严重,需要立即关注。

以上是当两者都实现时,为什么 Go 的 `fmt` 包更喜欢 `Error()` 而不是 `String()`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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