学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《字符串函数在 syscall.Errno 中》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
问题内容通读“go 编程语言”的 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
的字符串表示形式?
解决方案
答案可以在 fmt
文档 here 中找到:
如果格式(对于 println 等隐式为 %v)对于字符串 (%s %q %v %x %x) 有效,则应用以下两个规则:
如果操作数实现了错误接口,则会调用 error 方法将对象转换为字符串,然后根据动词(如果有)的要求进行格式化。
如果操作数实现 string() 字符串方法,则将调用该方法将对象转换为字符串,然后根据动词(如果有)要求对其进行格式化。
实际上,对于支持两者的任何值,根本不会调用 string()
方法,因为 error
接口优先于 stringer
接口。您可以使用类似 this one 的程序对此进行测试:
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
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。