阅读"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"
Run Code Online (Sandbox Code Playgroud)
我理解第一行和第二行.error
接口是saitisfied syscall.Errno
,因此Error()
功能返回string
是可用的.
我不明白第三个.通过我syscall
的来源我找不到任何syscall.Errno
满足stringer
接口的地方- String()
功能没有定义.
为什么第三个打印字符串表示sysscall.Errno
?
如果格式(对于Println等隐式%v)对字符串有效(%s%q%v%x%X),则适用以下两个规则:
如果操作数实现了错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有).
如果操作数实现方法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(""))
}
Run Code Online (Sandbox Code Playgroud)
输出:
error
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67 次 |
最近记录: |