Go 语言使用Protobuf 进行序列化详解

文章目录

  • Go 语言使用Protobuf 进行序列化详解
    • 1. Protobuf是什么?
    • 2. 安装Protobuf 及 Go 依赖
    • 3. 编写.proto 文件
    • 4. 实现序列化和反序列化

Go 语言使用Protobuf 进行序列化详解

1. Protobuf是什么?

以下是 Protobuf 官方中文文档的概述:

Protobuf(Protocol Buffers) 是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据。
它类似于 JSON,但更小、更快,并且生成本机语言绑定。您只需定义一次数据结构,然后可以使用特殊生成的源代码轻松地将结构化数据读写到各种数据流中,并使用各种语言。
Protocol buffers 是定义语言(在 .proto 文件中创建)、proto 编译器生成的用于与数据交互的代码、特定于语言的运行时库、写入文件(或通过网络连接发送)的数据的序列化格式以及序列化数据的组合。

相比较传统的传输协议, 其以紧凑的二进制格式进行传输, 对比 json,xml等文本格式能显著减少数据体积, 对比文本格式通常小3-10倍, 降低网络传输开销。
尤其是在序列化方面,得益于二进制数据无需文本解析, 处理速度更快,适合高性能场景。

2. 安装Protobuf 及 Go 依赖

使用 Protobuf 需要 Protobuf 编译器, 安装方法如下:
windows下载链接
在环境变量中加入Protobuf bin 目录
博主此处为25.6版本, 环境变量以自己下载版本为例

Linux下载方法:

 wget https://github.com/protocolbuffers/protobuf/releases/download/v30.0/protoc-30.0-linux-x86_64.zip
unzip protoc-30.0-linux-x86_64.zip -d /usr/local/

下载完成后输入

protoc --version
libprotoc 30.0	# 出现此行表示安装成功

安装 go protobuf 插件

go get -u google.golang.org/grpc

3. 编写.proto 文件

syntax = "proto3";	// 声明 protobuf 编译器版本
package Marshal;	// 声明包
option go_package = "./Marshal";	// 声明生成 .pd.go 文件的路径 此处表示在当前目录中的 Marshal 目录中

// 声明一个消息类型
// 字段使用键值对的方式定义, 以 类型 字段名 唯一编号进行定义, 该编号用来在二进制格式消息中识别字段
message User{
  int64 id = 1;
  string name = 2;
  string sex = 3;
  float money = 4;
  bool is_vip = 5;
  repeated string tags = 6;     // 数组类型
  map<string, string> info = 7; // map类型

  message Phone{      // 嵌套类型
    string num1 = 1;
    string num2 = 2;
  }
  Phone phone = 8;    // 嵌套类型需声明为一个字段才能使用
}

4. 实现序列化和反序列化

使用 protobuf 编译器根据 .proto 文件生成对应的 .pb.go 文件

protoc --go_out=. --go-grpc_out=. protoFileName.proto

实现序列化和反序列化

import (
	pd "Marshal/protobuf/Marshal"	// 导入生成的 .pb.go 文件
	f "fmt"
	"google.golang.org/protobuf/proto"	// 导入 proto 包
)

func main() {
	// 定义 生成消息对应的结构体对象
	user1 := &pd.User{
		Id:    1001,
		Name:  "Tom",
		Sex:   "man",
		Money: 100,
		IsVip: false,
		Tags:  []string{"football", "games", "music"},
		Info:  map[string]string{"age": "18", "passwd": "000000"},
		Phone: &pd.User_Phone{
			Num1: "10086",
			Num2: "10000",
		},
	}

	user2 := pd.User{}

	// 使用 proto 包中的 Marshal 方法对 user1 进行序列化
	data, err := proto.Marshal(user1)
	if err != nil {
		f.Println(err)
	}
	f.Printf("二进制数据大小:%d bytes\n", len(data))

	// 使用 proto 包中的 UnMarshal 方法对 user2 进行反序列化, 将数据反序列化进 user2
	err = proto.Unmarshal(data, &user2)
	if err != nil {
		f.Println(err)
	}
	f.Println(user2)
}
Go使用 Protocol Buffers(简称 proto)可以通过以下步骤进行: 1. 安装 protoc 编译器:Protocol Buffers 使用 protoc 编译器将 .proto 文件编译成 Go 代码。你可以从 [Protocol Buffers GitHub 仓库](https://github.com/protocolbuffers/protobuf/releases) 下载适合你操作系统的 protoc 编译器,并将其添加到系统 PATH 环境变量中。 2. 编写 .proto 文件:创建一个名为 example.proto 的文本文件,并使用 Protocol Buffers 的语法定义消息结构和服务。 示例 example.proto 文件: ```protobuf syntax = "proto3"; package example; message Person { string name = 1; int32 age = 2; repeated string hobbies = 3; } service Greeting { rpc SayHello (Person) returns (Person); } ``` 3. 生成 Go 代码:使用 protoc 编译器将 .proto 文件生成 Go 代码。在终端中运行以下命令: ```shell protoc --go_out=. example.proto ``` 这将在当前目录下生成一个 example.pb.go 文件,其中包含了根据 .proto 文件生成的 Go 结构体和服务代码。 4. 在 Go 代码中使用生成的代码:在你的 Go 代码中导入生成的代码文件,并使用其中定义的结构体和服务进行编程。 示例 Go 代码: ```go package main import ( "fmt" "log" example "path/to/generated/code" // 导入生成的代码包 "google.golang.org/protobuf/proto" ) func main() { person := &example.Person{ Name: "John", Age: 25, Hobbies: []string{"reading", "coding"}, } data, err := proto.Marshal(person) if err != nil { log.Fatal(err) } // 在这里可以将 data 发送给其他地方进行传输或存储 newPerson := &example.Person{} err = proto.Unmarshal(data, newPerson) if err != nil { log.Fatal(err) } fmt.Println(newPerson.GetName()) // 输出:John } ``` 以上就是使用 Protocol Buffers 在 Go 中的基本步骤。你可以根据自己的需求定义更复杂的消息结构和服务,并使用生成的 Go 代码进行序列化、反序列化等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值