Golang示例代码理解困难求助
Golang示例代码理解困难求助
你好,请看 Go 语言教程中的这段代码:
https://tour.golang.org/methods/19
为什么我没有调用 Error() 方法,但该方法返回的字符串却被打印出来了?
在第 27 行,打印了 err,它的类型是 *main.MyError。那么,在没有调用 Error() 方法的情况下,是如何打印出
在 2021-02-15 20:40:58.856545102 +0300 +03 m=+0.000045210,它没有工作
这条信息的呢?
3 回复
在 Go 语言中,当打印一个实现了 error 接口的值时,fmt 包会自动调用其 Error() 方法来获取字符串表示。这是因为 error 接口只定义了一个方法:Error() string,而 fmt 包针对实现了该接口的类型有特殊处理。
具体到你的例子,*MyError 类型实现了 error 接口,因此当你直接打印 err 时,fmt.Println(err) 内部会调用 err.Error() 来获取要显示的字符串。
以下是示例代码,演示了这一行为:
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("在 %v, %s", e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"它没有工作",
}
}
func main() {
if err := run(); err != nil {
// 这里 fmt.Println 会自动调用 err.Error()
fmt.Println(err)
}
}
输出类似:
在 2021-02-15 20:40:58.856545102 +0300 +03 m=+0.000045210, 它没有工作
即使你没有显式调用 Error() 方法,fmt 包也会为你调用。这是 Go 语言中接口和 fmt 包设计的一个便利特性。


