首页 >后端开发 >Golang >为什么 Go 的 `fmt` 包在打印时优先考虑 `Error()` 而不是 `String()`?

为什么 Go 的 `fmt` 包在打印时优先考虑 `Error()` 而不是 `String()`?

Barbara Streisand
Barbara Streisand原创
2024-11-24 02:33:10887浏览

Why Does Go's `fmt` Package Prioritize `Error()` Over `String()` When Printing?

Error() 优先于 String()

在 Go 中,fmt 包处理打印操作。当一个对象同时实现了 Error() 和 String() 方法时,出于打印目的,Error() 方法优先于 String()。

这种优先级源于错误的实际意义。错误通常比一般的字符串表示更重要。因此,如果一个对象实现了错误接口,则其 Error() 方法用于格式化和打印。

此行为记录在 fmt 的包文档中。以下摘录解释了优先顺序:

3. If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).
4. If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).

示例

考虑以下代码:

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 type 实现了 String() 和 Error() 方法。当调用 fmt.Println() 函数时,将调用 Error() 方法而不是 String(),从而产生以下输出:

Failed Failed

这演示了 Error() 优先于 String( ) 在 Go 的打印功能中。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn