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 关注
- 96 浏览
添加回答
举报