将函数分配给变量时,为什么编译器需要完美的函数签名匹配...
- 变量的类型是一个函数,其参数或返回是一个特定的接口,并且
- 被分配的功能需要不同的接口,但是是嵌入了预期接口的接口。
举这个例子,其中......
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
变量的值有什么不同?