将函数类型作为接口值

时间:2017-03-18 23:58:53

标签: go

我一直在阅读关于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()

1 个答案:

答案 0 :(得分:4)

fmt软件包的文档可以这样说:

  

除非使用动词%T%p打印,否则为特殊格式   注意事项适用于实现某些接口的操作数。   按申请顺序:

     

...

     

如果格式(%v等隐式Println)对a有效   string(%s %q %v %x %X),适用以下两条规则:

     
      
  1. 如果操作数实现了error接口,则将调用Error方法将对象转换为字符串,然后将该字符串   根据动词的要求格式化(如果有的话)。
  2.   
  3. 如果操作数实现方法String() string,则将调用该方法将对象转换为字符串,然后将该字符串   根据动词的要求格式化(如果有的话)。
  4.   

换句话说,fmt.Println将尝试打印接口的字符串表示形式。由于binFunc满足错误界面,因此它会调用Error的{​​{1}}方法。