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