1

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

1 回答 1

1

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

有关详细信息,请参阅来源。代码说:

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

在类型 switch 语句中检查传递对象的类型,如果对象实现错误接口,则将v.Error()其用作值。

于 2013-10-17T19:42:42.923 回答