Golang中如何使用protobuf处理嵌套切片
Golang中如何使用protobuf处理嵌套切片
我正在尝试传递一个 [][]int32 类型的消息,但我不明白如何在 .proto 文件中构造这个消息。
对于普通的 []int32,这样做是可行的:
message Message {
repeated int32 nums = 1;
}
对于 [][]int32,我该如何指定 nums 被重复两次呢?
2 回复
message Data {
repeated int32 nums = 1;
}
message Message {
repeated Data data = 1;
}
更多关于Golang中如何使用protobuf处理嵌套切片的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Protobuf中处理嵌套切片,你需要定义一个包含repeated字段的内部消息。对于[][]int32,可以这样定义:
message Int32Array {
repeated int32 values = 1;
}
message Message {
repeated Int32Array nums = 1;
}
在Go中的使用示例:
package main
import (
"fmt"
"log"
"google.golang.org/protobuf/proto"
)
func main() {
// 创建嵌套切片数据
msg := &Message{
Nums: []*Int32Array{
{Values: []int32{1, 2, 3}},
{Values: []int32{4, 5, 6}},
{Values: []int32{7, 8, 9}},
},
}
// 序列化
data, err := proto.Marshal(msg)
if err != nil {
log.Fatal("序列化失败:", err)
}
// 反序列化
newMsg := &Message{}
if err := proto.Unmarshal(data, newMsg); err != nil {
log.Fatal("反序列化失败:", err)
}
// 访问数据
for i, arr := range newMsg.Nums {
fmt.Printf("切片%d: %v\n", i, arr.Values)
}
}
如果你需要直接操作二维切片,可以这样转换:
// 将[][]int32转换为protobuf消息
func toProto(data [][]int32) *Message {
msg := &Message{}
for _, slice := range data {
msg.Nums = append(msg.Nums, &Int32Array{
Values: slice,
})
}
return msg
}
// 将protobuf消息转换为[][]int32
func fromProto(msg *Message) [][]int32 {
result := make([][]int32, len(msg.Nums))
for i, arr := range msg.Nums {
result[i] = arr.Values
}
return result
}
这种设计模式是Protobuf处理多维数组的标准方式,因为repeated字段不能直接嵌套使用。

