欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Protocol Buffers在golang里面的使用

Protocol Buffers在golang里面的使用

2024/11/30 20:35:40 来源:https://blog.csdn.net/lvdepeng123/article/details/125447793  浏览:    关键词:Protocol Buffers在golang里面的使用

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 mainimport ("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代码,可以方便地进行结构化数据的高效序列化和反序列化。如果你有更多问题或需要进一步帮助,请告诉我!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com