syscall.Errno 中的字符串函数

通读“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


幕布斯7119047
浏览 93回答 1
1回答

慕姐8265434

答案可在此处的fmt文档中找到:如果格式(对于 Println 等隐式为 %v)对于字符串有效(%s %q %v %x %X),则适用以下两个规则:如果操作数实现了错误接口,将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。如果一个操作数实现了 String() string 方法,将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。所以实际上,对于同时支持两者的任何值,String()根本不会调用该方法,因为error接口优先于Stringer接口。您可以使用这样的程序进行测试:package mainimport (    "fmt")type foo stringfunc (f foo) String() string {    return "string"}func (f foo) Error() string {    return "error"}func main() {    fmt.Println(foo(""))}输出:error
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go