1 回答
TA貢獻1798條經驗 獲得超3個贊
請記住,Go 不像 Java 那樣具有面向對象的繼承。這聽起來像是您正在嘗試編寫一個抽象基類來封裝“消息”的所有部分;這不是真正典型的 Go 風格。
您描述的字段是典型的消息元數據。您可以將此元數據封裝在純數據結構中。它不一定需要任何行為,也不一定需要 getter 和 setter 方法。
type MessageMeta struct {
Source Agent
Destination Agent
}
更面向對象的方法是說一條消息有一個(可變的)元數據塊和一個(不可變的,編碼的)有效負載。
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
}
將這兩件事分開傳遞的更程序化的方法也是合理的。在這種情況下,沒有什么是“消息”的接口,您只需傳遞編碼的有效負載;像這樣的標準庫接口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)
}
如果其中一個元數據字段是“交付于”,確保在整個鏈中傳遞一個指向元數據對象的指針可以讓您更新原始對象中的該字段。
我不會擔心將垃圾收集作為首要考慮因素,除非是為了避免過度浪費,并在 GC 開始出現在配置文件中時檢查對象分配。創建兩個對象而不是一個對象在這里可能不會成為一個大問題。
- 1 回答
- 0 關注
- 139 瀏覽
添加回答
舉報
