【发布时间】:2012-10-27 22:54:21
【问题描述】:
将函数赋值给变量时,为什么编译器需要完美的函数签名匹配时...
- 变量的类型是一个函数,其参数或返回是一个特定的接口,并且
- 被分配的函数需要一个不同的接口,但它是一个嵌入了预期接口的接口。
以这个例子为例......
-
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{}
}
所以我的问题不是关于替代解决方案,而是为什么编译器是这样构建的。
编译器似乎会看到,通过返回 FooerBarer,您因此返回了 Fooer,并且会接受分配。
所以...
- 编译器这种严格行为的原因是什么?
- 正在解决什么问题或正在避免什么危险?
- 为什么这与编译器在分配给
Fooer变量时接受FooerBarer值有什么不同?
【问题讨论】:
-
许多人会争辩“严格的接口是好的”。这就是编程强类型语言的全部意义,不是吗?我猜其他人都用 Perl 或 Javascript 编写代码;)
-
@paulsm4:我当然不同意那个(我还没有足够的知识不同意;-))。但在接口方面,有那种“只要你能做 X、Y 和 Z,我们就很酷” 之类的氛围,我本来希望编译器会实现。跨度>