関数を変数に割り当てるとき、コンパイラが次の場合に完全な関数シグネチャの一致を必要とするのはなぜですか...
- 変数の型は、パラメーターまたは戻り値が特定のインターフェースである関数であり、
- 割り当てられる関数には別のインターフェースが必要ですが、期待されるインターフェースを組み込むインターフェースです。
この例を見てください...
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
、割り当てを受け入れるように見えます。
それで...
- コンパイラのこの厳密な動作の理由は何ですか?
- どのような問題が解決されているか、危険が回避されていますか?
- これが、変数
FooerBarer
への代入で値を受け入れるコンパイラと異なるのはなぜですか?Fooer