GOLANG使用嵌入结构实现接口

前端之家收集整理的这篇文章主要介绍了GOLANG使用嵌入结构实现接口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文:https://gocn.io/article/332

考虑一个Packet接口,一般会返回一个Header,例如:

  1. type PacketHeader struct { ID uint32 Timestamp uint64 }
  2.  
  3. type Packet interface { encoding.BinaryMarshaler encoding.BinaryUnmarshaler Header() *PacketHeader }

如果是OO的语言,一般会有一个基类,里面包含了Header和实现这个Header:

  1. class BasePacket : public Packet {
  2. protected:
  3. PacketHeader h;
  4. public:
  5. virtual Header() *PacketHeader;
  6. };
  7.  
  8. class HandshakePacket : public BasePacket {
  9. };

在子类中就都实现了这个Header()方法了,在GOLANG同样可以做到,通过在Header中定义方法,在Packet中包含Header就可以。

  1. func (v *PacketHeader) Header() *PakcetHeader {
  2. return v
  3. }
  4.  
  5. type HandshakePacket struct { PacketHeader }

看起来还差不多的,都可以实现,golang只是代码少一点,清晰一点点而已。考虑要添加一些辅助函数,譬如给Packet添加是否是紧急类型的包,那OO语言得做一次代理:

  1. type Packet interface {
  2. IsErgency() bool
  3. }
  4.  
  5. class BasePacket {
  6. public:
  7. bool IsErgency() {
  8. return h.realtime < 3;
  9. }
  10. }

而在GOLANG中,只需要在Header实现就好了:

  1. func (v *PacketHeader) IsErgency() bool {
  2. return v.realtime < 3
  3. }

更高级的可以直接嵌入接口。譬如context.Context的实现,cancelCtx直接嵌入了一个接口:

  1. type cancelCtx struct {
  2. Context

通过指定类型,或者初始化的顺序初始化struct

  1. func newCancelCtx(parent Context) cancelCtx {
  2. return cancelCtx{
  3. Context: parent,done: make(chan struct{}),}
  4. }

结构嵌套的方式,让组合实现起来非常便捷,避免频繁的代理。

猜你在找的Go相关文章