Golang,Go:隐式调用接口函数?

Golang,Go:隐式调用接口函数?,go,Go,我有这个功能 func (e *MyError) Error() string { return fmt.Sprintf("AT %v, %s", e.When, e.What) } 但是 正如您在下面看到的,我从来没有调用过它,但是为什么在最终输出中调用它呢 type MyError struct { When time.Time What string } func (e *MyError) Error() string { return fmt.S

我有这个功能

 func (e *MyError) Error() string {
    return fmt.Sprintf("AT %v, %s", e.When, e.What)
 } 
但是

正如您在下面看到的,我从来没有调用过它,但是为什么在最终输出中调用它呢

type MyError struct {
    When time.Time
    What string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("AT %v, %s", e.When, e.What)
}

func run() error {
    return &MyError{
        time.Now(), "it didn't work",
    }
}

func main() {
    if err := run(); err != nil {
        fmt.Println(err)
    }
}

fmt.Println
pkg/fmt
中的其他函数分析传递给它的对象。 如果是错误,函数将对传递的对象调用
.error()
,并打印字符串 由
Error()
返回

有关详细信息,请参阅。守则说:

switch v := p.field.(type) {
case error:
    // ...
    p.printField(v.Error(), verb, plus, false, depth)
    return
// ...
}
传递对象的类型在类型开关语句中检查,如果是对象
实现,
v.Error()
用作值。

fmt.Println
pkg/fmt
中的其他函数分析传递给它的对象。 如果是错误,函数将对传递的对象调用
.error()
,并打印字符串 由
Error()
返回

有关详细信息,请参阅。守则说:

switch v := p.field.(type) {
case error:
    // ...
    p.printField(v.Error(), verb, plus, false, depth)
    return
// ...
}
传递对象的类型在类型开关语句中检查,如果是对象 实现,
v.Error()
用作值