// 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
函数转换的结果能够分配给err错误接口变量?error
是一个接口:
type error interface {
Error() string
}
这意味着任何具有方法的类型:都会Error() string
实现接口并可以分配给type的变量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
,我们可以将这个new分配给binFunc
类型为变量的变量error
:
var err error
var bf binFunc = binFunc(add)
err = bf
fmt.Println
的行为是为您调用.Error()
错误:
- 如果操作数实现错误接口,则将调用Error方法将对象转换为字符串,然后根据动词的要求对其进行格式化(如果有)。
因此,回答您的问题:
Error
执行该方法是因为fmt.Println
查找类型为的参数error
,将调用.Error()
并打印结果字符串。binFunc
,err
因为binFunc
它具有Error
方法。您不能add
直接分配给err
它,因为它没有Error
方法。但你被允许转换add
到binFunc
,因为它们具有相同的函数签名,并通过这样做,你可以把它分配给err
变量。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句