我一直在阅读关于function types as interface values的内容,我遇到了一个我无法弄清楚的例子。这是:
type binFunc func(int, int) int
func add(x, y int) int { return x + y }
func (f binFunc) Error() string { return "binFunc error" }
func main() {
var err error
err = binFunc(add)
fmt.Println(err)
}
您可以在Go Playground here找到它。
我知道您可以为函数类型分配方法,但我不明白如何调用Error()
。
答案 0 :(得分:4)
fmt软件包的文档可以这样说:
除非使用动词
%T
和%p
打印,否则为特殊格式 注意事项适用于实现某些接口的操作数。 按申请顺序:...
如果格式(
%v
等隐式Println
)对a有效 string(%s %q %v %x %X
),适用以下两条规则:
- 如果操作数实现了
error
接口,则将调用Error
方法将对象转换为字符串,然后将该字符串 根据动词的要求格式化(如果有的话)。- 如果操作数实现方法
醇>String() string
,则将调用该方法将对象转换为字符串,然后将该字符串 根据动词的要求格式化(如果有的话)。
换句话说,fmt.Println
将尝试打印接口的字符串表示形式。由于binFunc
满足错误界面,因此它会调用Error
的{{1}}方法。