GOLANG使用嵌入結構實現介面
考慮一個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 BasePacketHeader {
public:
bool IsErgency() {
return realtime < 3;
}
}
class BasePacket {
public:
bool IsErgency() {
return h.IsErgency();
}
}
而在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】Go 通過結構(struct) 實現介面(interface)GolangStruct
- 在Golang中使用Zap實現結構化日誌記錄Golang
- Golang 學習——如何判斷 Golang 介面是否實現?Golang
- 使用 FastText 實現詞嵌入AST
- ARM嵌入式體系結構與介面技術
- SemanticKernel/C#:實現介面,接入本地嵌入模型C#模型
- Go 語言介面及使用介面實現連結串列插入Go
- 使用泛型實現棧結構泛型
- 資料結構——單連結串列介面實現(C語言)資料結構C語言
- golang 實現連結串列爽不爽?Golang
- 介面測試返回結構對比實現思路記錄
- 【Golang】基於beego/orm實現相同表結構不同表名的分表方法實現GolangORM
- golang 簡單實現介面資料格式化Golang
- Golang 實現 Redis(5): 使用跳錶實現 SortedSetGolangRedis
- Golang中struct結構標籤(Tag)的使用GolangStruct
- 我的 golang 學習筆記系列三:結構體和介面Golang筆記結構體
- 使用C#實現資料結構堆C#資料結構
- 基於“結構體”實現簡易版學生管理系統(Golang)結構體Golang
- struct 和 interface:結構體與介面都實現了哪些功能?Struct結構體
- Golang 限流器的使用和實現Golang
- 使用golang實現redis伺服器GolangRedis伺服器
- golang類和結構體Golang結構體
- 理解Golang的Time結構Golang
- 能否使用B/S結構實現所有C/S結構軟體的功能
- Kotlin實戰:使用DSL構建結構化API去掉冗餘的介面方法KotlinAPI
- Go 之基礎速學 (十) golang 裡介面的實現Golang
- javascript實現Map結構JavaScript
- Oracle MAA 結構實現Oracle
- 連結串列以及golang介入式連結串列的實現Golang
- Golang原始碼學習:使用gdb除錯探究Golang函式呼叫棧結構Golang原始碼除錯函式
- 資料結構和演算法(Golang實現)(25)排序演算法-快速排序資料結構演算法Golang排序
- golang拾遺:嵌入型別Golang型別
- [譯] Golang 資料結構:樹Golang資料結構
- golang開發目錄結構Golang
- Golang 優化之路——空結構Golang優化
- Go型別嵌入介紹和使用型別嵌入模擬實現“繼承”Go型別繼承
- golang中的類和介面的使用Golang
- golang的fmt包String(),Error(),Format(),GoString()的介面實現GolangErrorORM