原文:https://gocn.io/article/332
考虑一个Packet接口,一般会返回一个header,例如:
type Packetheader struct @H_403_10@{ ID uint32 Timestamp uint64 }type Packet interface @H_403_10@{ enCoding.BinaryMarshaler enCoding.BinaryUnmarshaler header() *Packetheader }
如果是OO的语言,一般会有一个基类,里面包含了header和实现这个header:
class BasePacket : public Packet {protected: Packetheader h;public: virtual header() *Packetheader;};class HandshakePacket : public BasePacket {};
在子类中就都实现了这个header()
方法了,在GolANG同样可以做到,通过在header中定义方法,在Packet中包含header就可以。
func (v *Packetheader) header() *Pakcetheader { return v}type HandshakePacket struct @H_403_10@{ Packetheader }
看起来还差不多的,都可以实现,golang只是代码少一点,清晰一点点而已。考虑要添加一些辅助函数,譬如给Packet添加是否是紧急类型的包,那OO语言得做一次代理:
type Packet interface { IsErgency() bool}class BasePacket {public: bool IsErgency() { return h.realtime < 3; }}
而在GolANG中,只需要在header实现就好了:
func (v *Packetheader) IsErgency() bool { return v.realtime < 3}
更高级的可以直接嵌入接口。譬如context.Context
的实现,cancelCtx
直接嵌入了一个接口:
type cancelCtx struct { Context
通过指定类型,或者初始化的顺序初始化struct
:
func newCancelCtx(parent Context) cancelCtx { return cancelCtx{ Context: parent,done: make(chan struct{}),}}
结构嵌套的方式,让组合实现起来非常便捷,避免频繁的代理。
总结以上是内存溢出为你收集整理的GOLANG使用嵌入结构实现接口全部内容,希望文章能够帮你解决GOLANG使用嵌入结构实现接口所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)