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字段不能直接嵌套使用。

回到顶部