golang关于自定义类型实现error接口的一个疑问,刚开始学习go语言有点不太明白
1. 运行环境
golang版本:go version go1.16.2 windows/amd64
3). 当前系统
Windows 10
2. 问题描述?
我在下面代码中中定义了MyFloat自定义类型,定义了类型值方法Error,实现了go中的error接口,但是在使用中有点疑问,为何MyFloat(3.2)可以直接调用Error方法,不是应该MyFloat(3.2).Error()调用一下吗
package main
import (
"fmt"
)
type MyFloat float64
func (m MyFloat) Error() string {
return fmt.Sprintf("Called")
}
func main() {
a := MyFloat(3.2)
fmt.Println(a) // 此时输出Called而不是3.2,但是我并没有打印a.Error(),Error()是怎么调用的呢?
}
查了资料,得知对于fmt,有两个比较特殊的方法Error和String,如果直接打印对象a,如果有Error方法,会优先执行a.Error,而不是a本身,如果没有Error方法,再判断有没有String方法,如果有,就执行a.String,而不是本身a。
可参考pkg.go.dev/fmt 中的描述