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