GOLANG使用嵌入结构实现接口

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

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

type PacketHeader struct { ID uint32 Timestamp uint64 }

type Packet interface { 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 { 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{}),}
}

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

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...