你在学习golang相关的知识吗?本文《指针和 protobuf 的无法解释的行为》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可
你在学习golang相关的知识吗?本文《指针和 protobuf 的无法解释的行为》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容我正在努力找出这种行为的原因,或者也许这应该发生,但我只是没有意识到。 作为背景,我使用的是 proto3,并且在 Go1.15 中执行此操作,并且我确实知道 packed 是 proto3 中的默认值,而且我对 protobufs 相对较新。
我在原型文件中定义了以下消息:
message response {
repeated uint32 points = 1 [packed=true];
}
这将使用 protoc-gen-go v1.25.0 生成以下代码。
type response struct {
state protoimpl.messagestate
sizecache protoimpl.sizecache
unknownfields protoimpl.unknownfields
points []uint32 `protobuf:"varint,3,rep,packed,name=points,JSON=points,proto3" json:"points,omitempty"`
}
我去使用新的结构,它的行为与我通常期望的结构的行为不同。这是我写的一些内容以及打印出来的内容。
newresponse := pb.response{points: []uint32{2,4,6,8}}
fmt.println(newresponse)
//{{{} [] [] <nil>} 0 [] [2 4 6 8] --> i expect this
reftonewresponse := &newresponse
fmt.println(reftonewresponse)
// points:2 points:4 points:6 points:8 --> not what i expected
现在您可能会想,这只是格式化而已。 但我期望一个列表......而不是每个数字都有一个标签。我见过并使用过其他 protobuf...当我看到它们返回的响应时,它看起来不像这样,它是一个列表的标签,例如:
points: [2 4 6 8]
我确实需要使用它的参考版本,因为我最终想扩展并使用一个响应列表,生成的代码将吐出一片指针响应,但我不明白为什么它要分离和标记每个响应切片中的元素。
我希望有人能指出我正在做或没有做的某些事情导致了这种情况......提前谢谢您。
这确实只是格式化。底层数据结构没有任何变化。您请求了一个 repeated uint32 Points 并且它确实以这种方式打印它们。
protobuf 实现中的封送拆收器确实可以输出任何它喜欢的内容,没有人类可读的 protobuf 表示的参考版本。
如果您确实必须为 .String() 输出使用自定义格式,您可以尝试不同的原型库,例如 gogoprotobuf,或尝试各种扩展。但最终,它只是人类可读的输出。
注意:
packed=true 无关(这确实是默认值)。String() 方法有一个指针接收器。参见this question终于介绍完啦!小伙伴们,这篇关于《指针和 protobuf 的无法解释的行为》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!
--结束END--
本文标题: 指针和 protobuf 的无法解释的行为
本文链接: https://www.lsjlt.com/news/596680.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0