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

时间:2013-10-17 19:29:15

标签: go

http://play.golang.org/p/xjs-jwMsr7

我有这个功能

 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)
    }
}

1 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅the source。代码说:

switch v := p.field.(type) {
case error:
    // ...
    p.printField(v.Error(), verb, plus, false, depth)
    return
// ...
}

在类型switch语句中检查传递的对象的类型,如果是对象 实施error interfacev.Error()用作值。