在Golang中转换函数类型

时间:2015-09-04 08:27:35

标签: go

// Each type have Error() string method.
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
//  type error interface {
//   Error() string
//  }

func (f binFunc) Error() string {
    return "binFunc error"
}

func func_type_convert() {
    var err error
    err = binFunc(add)
    fmt.Println(err)
    fmt.Println(i)
}

我对上面的代码有两个问题:

  • Error函数转换为add类型时,我不知道执行binFunc方法的原因是什么?
  • 为什么add函数转换结果能够分配给错误的错误接口变量?

1 个答案:

答案 0 :(得分:6)

error是一个界面:

type error interface {
    Error() string
}

这意味着任何具有方法的类型:Error() string都可以实现接口,并且可以分配给error类型的变量。

binFunc有这样一种方法:

func (f binFunc) Error() string {
    return "binFunc error"
}

Go中的新开发人员有时会发现这一点令人困惑,因为他们没有意识到可以将方法附加到结构以上。在这种情况下binFunc被定义为喜欢:

type binFunc func(int, int) int

所以它的工作方式是允许你转换任何具有相同签名的函数:(来自spec

  

函数类型表示具有相同参数和结果类型的所有函数的集合。

因此,如果您创建一个函数add

func add(x, y int) int {
    return x + y
}

您可以将其转换为binFunc

binFunc(add)

由于我们在上面定义的Error上的binFunc方法,我们可以将此新binFunc分配给error类型的变量:

var err error
var bf binFunc = binFunc(add)
err = bf

fmt.Println的行为是针对错误for you致电.Error()

  
      
  1. 如果操作数实现了错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有的话)。
  2.   

所以回答你的问题:

  • 执行Error方法是因为fmt.Println查找类型error的参数,调用.Error()并打印结果字符串。
  • 您可以将binFunc分配给err,因为binFuncError方法。您无法将add直接分配给err,因为它没有Error方法。但是,您可以将add转换为binFunc,因为它们具有相同的功能签名,然后您可以将其分配给err变量。