syscall.Errno中的字符串函数

Mar*_*zek 0 go

阅读"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

Fli*_*mzy 5

答案可以在这里fmt文档中找到:

如果格式(对于Println等隐式%v)对字符串有效(%s%q%v%x%X),则适用以下两个规则:

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

  2. 如果操作数实现方法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)