1 回答

TA貢獻(xiàn)1798條經(jīng)驗 獲得超3個贊
請記住,Go 不像 Java 那樣具有面向?qū)ο蟮睦^承。這聽起來像是您正在嘗試編寫一個抽象基類來封裝“消息”的所有部分;這不是真正典型的 Go 風(fēng)格。
您描述的字段是典型的消息元數(shù)據(jù)。您可以將此元數(shù)據(jù)封裝在純數(shù)據(jù)結(jié)構(gòu)中。它不一定需要任何行為,也不一定需要 getter 和 setter 方法。
type MessageMeta struct {
Source Agent
Destination Agent
}
更面向?qū)ο蟮姆椒ㄊ钦f一條消息有一個(可變的)元數(shù)據(jù)塊和一個(不可變的,編碼的)有效負(fù)載。
import "encoding"
type Message interface {
encoding.BinaryMarshaler // requires MarshalBinary()
Meta() *MessageMeta
}
type SomeMessage struct {
MessageMeta
Greeting string
}
func (m *SomeMessage) Meta() *MessageMeta {
return &m.MessageMeta
}
func (m *SomeMessage) MarshalBinary() ([]byte, error) {
return []byte(m.Greeting), nil
}
將這兩件事分開傳遞的更程序化的方法也是合理的。在這種情況下,沒有什么是“消息”的接口,您只需傳遞編碼的有效負(fù)載;像這樣的標(biāo)準(zhǔn)庫接口encoding.BinaryMarshaler在這里很有意義。您可以將其包含在屬于您的庫的較低級別的界面中。
func Deliver(meta *MessageMeta, payload []byte) error { ... }
將一個翻譯成另一個很容易
func DeliverMessage(m Message) error {
payload, err := m.Payload()
if err != nil {
return err
}
meta := m.Meta()
return Deliver(meta, payload)
}
如果其中一個元數(shù)據(jù)字段是“交付于”,確保在整個鏈中傳遞一個指向元數(shù)據(jù)對象的指針可以讓您更新原始對象中的該字段。
我不會擔(dān)心將垃圾收集作為首要考慮因素,除非是為了避免過度浪費,并在 GC 開始出現(xiàn)在配置文件中時檢查對象分配。創(chuàng)建兩個對象而不是一個對象在這里可能不會成為一個大問題。
- 1 回答
- 0 關(guān)注
- 114 瀏覽
添加回答
舉報