Admin: Sending Admin Email To AriesDevil<ariesdevil@xxoo.com>
详细代码:http://play.golang.org/p/JGhFaJnGpS
预料之中,Admin 类型的接口实现被 SendNotification 函数调用。现在我们用外部类型来调用 Notify 方法会发生什么呢:
admin.Notify()
// Output
Admin: Sending Admin Email To AriesDevil<ariesdevil@xxoo.com>
详细代码:http://play.golang.org/p/EGqK6DwBOi
我们得到了 Admin 类型的接口实现的输出。User 类型的接口实现不被提升到外部类型了。
现在我们有了足够的依据来回答问题了:
1.编译器会因为我们同时有两个接口实现而报错吗?
不会,因为当我们使用嵌入类型时,类型名充当了字段名。嵌入类型作为结构体的内部类型包含了自己的字段和方法,且具有唯一的名字。所以我们可以有同一接口的内部实现和外部实现。
1.如果编译器接受这样的定义,那么当接口调用时编译器要怎么确定该使用哪个实现?
如果外部类型包含了符合要求的接口实现,它将会被使用。否则,通过方法提升,任何内部类型的接口实现可以直接被外部类型使用。
总结
在 Go 语言中,方法,接口和嵌入类型一起工作方式是独一无二的。这些特性可以帮助我们像面向对象那样组织结构然后达到同样的目的,并且没有其它复杂的东西。用本文中谈到的语言特色,我们可以以极少的代码来构建抽象和可伸缩性的框架。










