本文深入讲解go语言中`fmt.println`如何根据接收者类型(值 vs 指针)决定是否自动调用`error()`方法,揭示`error`接口满足条件与接口动态绑定的核心机制。
在Go语言中,error是一个内建接口,定义为:
type error interface {
Error() string
}
任何类型只要实现了Error() string方法,就满足error接口。但关键在于:该方法是为值类型实现的,还是为指针类型实现的? 这直接决定了哪些值能被自动识别为error。
回到你的示例代码:
func (e *MyError) Error() string { // ✅ 方法绑定在 *MyError 上
return fmt.Sprintf("at %v, %s", e.When, e.What)
}
你为*MyError(即MyError的指针类型)实现了Error()方法,而非MyError本身。因此: