// 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
函数转换结果能够分配给错误的错误接口变量?答案 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()
:
- 如果操作数实现了错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有的话)。
所以回答你的问题:
Error
方法是因为fmt.Println
查找类型error
的参数,调用.Error()
并打印结果字符串。 binFunc
分配给err
,因为binFunc
有Error
方法。您无法将add
直接分配给err
,因为它没有Error
方法。但是,您可以将add
转换为binFunc
,因为它们具有相同的功能签名,然后您可以将其分配给err
变量。