【发布时间】:2015-06-10 14:14:50
【问题描述】:
首先,我不太确定这个问题是否与错误更相关,或者与 GoLang 中的接口更相关
我正在按照教程学习 GoLang。这个问题来自本教程page
是错误界面的基本演示。当我像这样更改代码时,我感到很困惑:
package main
import (
"fmt"
"time"
)
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() *MyError {
return &MyError{
time.Now(), "it didn't work",
}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
err1 := MyError{time.Now(), "it works again"}
fmt.Println(err1)
fmt.Println(err1.Error())
}
这段代码的输出是:
at 2015-04-06 15:00:07.1541719 +0800 CST, it didn't work
{2015-04-06 15:00:07.155172 +0800 CST it works again}
at 2015-04-06 15:00:07.155172 +0800 CST, it works again
让我感到困惑的是 fmt 在什么情况下会隐式调用 MyError.Error() 接口。
据我了解,第一个和第二个 fmt.Println() 应该具有相同的变量类型:MyError。但显然第一个调用涉及 MyError 类型的 Error() 的隐式调用,而第二个则没有。
什么机制造成了这种差异?
感谢您调查这个初学者的问题!
【问题讨论】:
标签: go