前言
在golang中,结构体内嵌结构体,接口内嵌接口都很常见,但是结构体内嵌接口很少见。它是做什么用的呢?
当我们需要重写实现了某个接口的结构体的(该接口)的部分方法,可以使用结构体内嵌接口。
作用
- 继承赋值给接口的结构体的方法。
空接口:需要先断言类型,再通过变量访问方法。
确定接口,匿名字段,内嵌方法,可以直接访问。不是匿名字段,需要通过变量名访问。
- 重写继承结构体的方法
条件:
- 接口需要是匿名字段,嵌入方法。
- 重写接口方法。
空接口:赋值接口体的方法不能重写,因为空接口一开始不能确定类型,并且不能定义为匿名字段。
确定接口:
假设现在有一个需求,重写Cat的Walk方法,并且Speak方法保持不变。
当然我们可以重新创建一个结构体,实现接口中所以的方法来实现。但是如果这个接口又很多方法,全部实现一遍就有点小题大做了,而且我们只是需要重写部分方法,其它方法保持不变。
这个时候我们可以通过结构体内嵌接口来实现。
新增一个JiaFeiCat结构体,初始化时将Cat类型的变量传入,JiaFeiCat结构体定义一个Walk方法,这个方法会覆盖Cat的同名方法,从而实现了Walk方法的重写。
总结
结构体内嵌接口的作用:
- 不依赖具体实现:即接口为A,结构体B1、B2实现了接口A,结构体C内嵌了A,那么C.A可以通过B1/B2实例化;
- 对接口类型进行重写:当C.A通过B1实例化后,C和B1的关系,可以转变为结构体C内嵌结构体B1,那么C可以直接使用B1中的所有方法,当然C也可以对B1中的方法进行重写,这里官方文档这样解释“Interface and we can override a specific method without having to define all the others.”
参考:
golang接口用法之:结构体内嵌匿名接口_golang 匿名接口-CSDN博客