golang protobuf封送固定大小的空结构
我有一个protobuf结构golang protobuf封送固定大小的空结构,go,proto,Go,Proto,我有一个protobuf结构Data 在.proto中: message Data { uint64 ID = 1; uint32 GUID = 2; } 在戈兰 b, err := proto.Marshal(&pb.Data{}) if err != nil { panic(err) } fmt.Println(len(b)) 我得到了0长度 如何使proto.Marshal始终返回固定大小,而不管pb.Data是什么 附言 pb.数据仅包含在字节数组上调
Data
在.proto
中:
message Data {
uint64 ID = 1;
uint32 GUID = 2;
}
在戈兰
b, err := proto.Marshal(&pb.Data{})
if err != nil {
panic(err)
}
fmt.Println(len(b))
我得到了0
长度
如何使proto.Marshal始终返回固定大小,而不管pb.Data是什么
附言
pb.数据仅包含在字节数组上调用的len()
和int32
。它将计算该数组中的元素数,并返回它
如果您刚刚实例化了一个新的、空的protobuf指针对象,其中没有任何内容,那么封送的字节数组将不会保存任何数据——因此您将获得0
我很不确定你想要它归还什么。你能用你想要的输出来进一步澄清你的问题吗?我也许能更好地回答你的问题。这里有两个问题 1) protobuf对整数使用可变编码,因此大小取决于值,请参阅 2) 默认情况下不会传输零值字段,因此,由于两个整数为零,因此即使它们的字段标识符也不会发送。我甚至不确定是否有发送零值的选项 若将它们都设置为1,则字节数将超过零,但根据值的范围,其长度仍然不会固定 所以,一般来说,在protobuf消息中没有真正的方法来强制执行固定大小 如果您想要固定长度的消息,您可能最好在有线类型编码上使用直接结构,但这对于语言互操作来说就更难了,因为它们都必须定义相同的消息,您将失去简单的消息迁移和protobuf提供的所有酷东西 可能有固定大小结构的选项,但它们通常也会压缩,这将再次产生可变长度的消息 如果您描述了您试图最终解决的问题,我们可能会建议其他替代方案