通读“The Go Programming Language”的 7.8 部分,我发现了以下代码:var err error = syscall.Errno(2)
fmt.Println(err.Error()) // "no such file or directory"
fmt.Println(err) // "no such file or directory"我理解第一行和第二行。error接口由 满足syscall.Errno,因此Error()函数返回string是可用的。第三个没看懂 通过syscall的来源,我找不到任何syscall.Errno满足stringer接口的地方 -String()未定义功能。为什么第三个打印字符串表示形式sysscall.Errno?
1 回答
慕姐8265434
TA贡献1813条经验 获得超2个赞
答案可在此处的fmt
文档中找到:
如果格式(对于 Println 等隐式为 %v)对于字符串有效(%s %q %v %x %X),则适用以下两个规则:
如果操作数实现了错误接口,将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。
如果一个操作数实现了 String() string 方法,将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。
所以实际上,对于同时支持两者的任何值,String()
根本不会调用该方法,因为error
接口优先于Stringer
接口。您可以使用这样的程序进行测试:
package main
import (
"fmt"
)
type foo string
func (f foo) String() string {
return "string"
}
func (f foo) Error() string {
return "error"
}
func main() {
fmt.Println(foo(""))
}
输出:
error
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报
0/150
提交
取消