为什么编译器对功能签名要求如此严格的匹配?

将函数分配给变量时,为什么编译器在以下情况下需要完美的函数签名匹配...

  • 变量的类型是一个函数,其参数或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变量的值时有什么不同?


小怪兽爱吃肉
浏览 159回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go