登录
首页 >  Golang >  Go问答

字符串函数在 syscall.Errno 中

来源:stackoverflow

时间:2024-03-28 17:36:27 232浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《字符串函数在 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) 有效,则应用以下两个规则:

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

  2. 如果操作数实现 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学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>