为了账号安全,请及时绑定邮箱和手机立即绑定

syscall.Errno 中的字符串函数

syscall.Errno 中的字符串函数

Go
幕布斯7119047 2023-05-15 09:49:24
通读“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),则适用以下两个规则:

  1. 如果操作数实现了错误接口,将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。

  2. 如果一个操作数实现了 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


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信