将函数分配给变量时,为什么编译器在以下情况下需要完美的函数签名匹配...
变量的类型是一个函数,其参数或return是特定的接口,并且
分配的功能需要一个不同的接口,但是是一个嵌入了预期接口的接口。
以这个例子为例...
Fooer
是一个接口
FooerBarer
是嵌入Fooer
接口的接口
*bar
贯彻 FooerBarer
http://play.golang.org/p/8NyTipiQak
// Define a type that is a function that returns a Fooer interface
type FMaker func() Fooer
/* Define values of the FMaker type */
// This works, because the signature matches the FMaker type
var fmake FMaker = func() Fooer {
return &bar{}
}
// This causes an error even though a FooerBarer is a Fooer
var fmake2 FMaker = func() FooerBarer {
return &bar{}
}
所以我的问题不是关于替代解决方案,而是为什么编译器是以这种方式构建的。
似乎编译器将看到通过返回a FooerBarer,因此您将返回a Fooer,并且将接受赋值。
所以...
产生这种严格的编译器行为的原因是什么?
解决了什么问题或避免了危险?
为什么这与编译器FooerBarer
在分配给Fooer
变量的值时有什么不同?
相关分类