Protocol Buffers(简称 Protobuf)是一种与语言无关且平台无关的用于序列化结构化数据的方式,类似于JSON或XML,但更高效。Proto标签是用于指定Go结构体字段如何映射到Protobuf字段的标记。在使用Protobuf时,你需要了解如何定义.proto文件、生成Go代码以及理解生成代码中的Proto标签。

Proto标签在Go里面的意思

Proto标签是在生成的Go结构体字段中出现的标签,用于描述 Protobuf 序列化和反序列化过程的相关信息。一个典型的Proto标签包含以下信息:

  1. Wire Type: 指定字段使用的类型,例如varintbytes等。
  2. Field Number: 字段的唯一标识号。
  3. Field Options: 字段的可选配置,例如opt(optional,可选)和proto3(使用 Protobuf 版本3)。

举例说明:

MsgType uint32 `protobuf:"varint,1,opt,name=msg_type,json=msgType,proto3" json:"msg_type,omitempty"`

解释:

  • protobuf: Protobuf标签的名称。
  • varint: 指定字段被编码为varint(可变长度整数)。
  • 1: Protobuf字段编号(field number)。
  • opt: 表示该字段是可选的。
  • name=msg_type,json=msgType: 指定字段的名字。在Go和JSON中的名字分别是msg_typemsgType
  • proto3: 使用Protobuf的版本3(proto3)。

如何使用Proto标签

  1. 定义.proto文件

    首先,你需要定义一个包含消息格式的.proto文件。例如,定义一个名为webbackend.proto的文件:

    syntax = "proto3";
    
    package example;
    
    message WebBackend {
      uint32 msg_type = 1;
      string server_id = 2;
      bytes raw_data = 3;
      bytes additional_info = 4;
    }
    

      这定义了一个WebBackend消息,包括四个字段。

  2. 生成Go代码

    使用protoc(Protobuf编译器)编译.proto文件以生成Go代码。假设你已经安装了protocprotoc-gen-go插件,可以使用以下命令:

protoc --go_out=. webbackend.proto

          这会生成一个名为webbackend.pb.go的文件,包含Go语言的WebBackend消息结构体。 

 

     3.理解生成的代码

生成的webbackend.pb.go文件中包含了类似以下形式的Go结构体: 

type WebBackend struct {
    MsgType         uint32   `protobuf:"varint,1,opt,name=msg_type,json=msgType,proto3" json:"msg_type,omitempty"`
    ServerId        string   `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
    RawData         []byte   `protobuf:"bytes,3,opt,name=raw_data,json=rawData,proto3" json:"raw_data,omitempty"`
    AdditionalInfo  []byte   `protobuf:"bytes,4,opt,name=additional_info,json=additionalInfo,proto3" json:"additional_info,omitempty"`
}

 

使用Protobuf生成的代码

一旦生成了Go代码, 你可以使用该Go结构体进行序列化和反序列化操作。例如:

 
package main

import (
    "fmt"
    "log"

    "example/webbackend"
    "google.golang.org/protobuf/proto"
)

func main() {
    // 创建一个 WebBackend 实例
    wb := &webbackend.WebBackend{
        MsgType: 123,
        ServerId: "server-456",
        RawData: []byte{0x01, 0x02, 0x03},
        AdditionalInfo: []byte{0x04, 0x05},
    }

    // 序列化
    data, err := proto.Marshal(wb)
    if err != nil {
        log.Fatal("marshaling error: ", err)
    }

    fmt.Println("Serialized data:", data)

    // 反序列化
    newWb := &webbackend.WebBackend{}
    err = proto.Unmarshal(data, newWb)
    if err != nil {
        log.Fatal("unmarshaling error: ", err)
    }

    fmt.Println("Deserialized data:", newWb)
}

上述代码演示了如何创建WebBackend实例并进行序列化和反序列化。

总结

Proto标签在Protobuf生成的Go代码中起到了指定字段编码方式的重要作用。通过定义.proto文件并使用protoc工具生成Go代码,可以方便地进行结构化数据的高效序列化和反序列化。如果你有更多问题或需要进一步帮助,请告诉我!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部