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 回复

谢谢,我差不多明白了。

更多关于Golang示例代码理解困难求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


fmt.Print* 系列函数(fmt.Printlnfmt.Sprintf 等)遇到 error 参数时,它们默认的格式化方式是调用该 errorError 函数。

在 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 包设计的一个便利特性。

回到顶部