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