解组任意消息的协议.Protobuf消息多态性



有一个Go服务器通过UDP接受消息。使用这种设计,它将能够只扫描一种特定类型的实体world.Entity

for {
buf := make([]byte, 1024)
n, addr, err := pc.ReadFrom(buf)
if err != nil {
log.Println(err)
continue
}
packet := &service.Packet{}
err = proto.Unmarshal(buf[:n], packet)
if err != nil {
log.Println(err)
continue
}
log.Println(packet)
go serve(pc, addr, buf[:n])
}

如何以允许发送不同类型消息的方式更改设计?理由是使这个UDP服务器像REST API一样工作。假设有一个world.Packet消息由一个枚举字段和另一个可以具有不同类型消息的字段组成。服务器检查枚举,并根据它尝试对消息进行解组,消息可以是多种类型。Protobuf中是否有工具可以实现这一点?

我意识到这不是唯一的解决办法。一种更简单的方法(但更详细(是为不同的"消息"生成不同种类的消息;端点";(具有不同枚举字段的消息(。还有其他解决方案吗?你认为哪一个最好?

在protobuf中,查看oneof。使用带有oneof字段的单个/通用外部消息,可以自动处理所有预期的内部类型。一些protobuf实现可以将其表示为多态性,尽管这不是默认的体验。

最新更新