原文: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{}),}
- }
结构嵌套的方式,让组合实现起来非常便捷,避免频繁的代理。