Go 为什么返回实现错误接口的类型会自动调用error()方法?

Go 为什么返回实现错误接口的类型会自动调用error()方法?,go,Go,链接: 我知道内置类型error如下所示 type error interface { Error() string } 意思是MyError实现error。 run()方法返回指向MyError类型的指针 但是方法签名中run()方法的返回类型是error类型 run()中的return语句如何自动调用Error()方法?此处fmt。Println()负责调用Error()方法而不是run() 引述自: fmt包通过调用其error()字符串格式化错误值 方法 错误实现的责任是总结

链接:

我知道内置类型
error
如下所示

type error interface {
    Error() string
}
意思是
MyError
实现
error
run()
方法返回指向
MyError
类型的指针

但是方法签名中
run()
方法的返回类型是
error
类型

run()
中的return语句如何自动调用
Error()
方法?

此处
fmt。Println()
负责调用
Error()
方法而不是
run()

引述自:

fmt包通过调用其
error()
字符串格式化错误值 方法

错误实现的责任是总结错误 上下文os.Open格式返回的错误为“Open/etc/passwd: 权限被拒绝,“而不仅仅是”权限被拒绝“。返回错误 根据我们的Sqrt,缺少有关无效参数的信息

因此,当您试图在
main()
内部打印
err
时,将调用其
Error()
方法

将其替换为其他内容,那么您将不会在输出中看到它:

此处
fmt。Println()
负责调用
Error()
方法not
run()

引述自:

fmt包通过调用其
error()
字符串格式化错误值 方法

错误实现的责任是总结错误 上下文os.Open格式返回的错误为“Open/etc/passwd: 权限被拒绝,“而不仅仅是”权限被拒绝“。返回错误 根据我们的Sqrt,缺少有关无效参数的信息

因此,当您试图在
main()
内部打印
err
时,将调用其
Error()
方法


将其替换为其他内容,然后您将不会在输出中看到它:

对于记录,此修改版本证明调用
.Error()
的是
fmt.Println(err)
语句。我使用
fmt.Printf(“%#v”)
检查错误结构的内容,而不实际调用它的
.error()
方法,并且我将时间戳的设置移动到
.error()
方法本身,以便在调用
.error()
时可以看到它的更改。具体来说,调用Error()的行在这里(在发表此评论时链接到主分支头):对于记录,此修改版本证明调用
.Error()
的是
fmt.Println(err)
语句。我使用
fmt.Printf(“%#v”)
检查错误结构的内容,而不实际调用它的
.error()
方法,并且我将时间戳的设置移动到
.error()
方法本身,以便在调用
.error()
时可以看到它的更改。具体来说,调用Error()的行位于此处(在发表此评论时链接到主分支负责人):
type error interface {
    Error() string
}