1. protobuf的安装
1)安装地址:https://github.com/protocolbuffers/protobuf
右侧有个Releases,点击进入可以看到最新版本,目前是Protocol Buffers v3.19.3
可以找到对应的系统下载安装包,我的是win10系统,下载protoc-3.19.3-win64.zip
2)下载完毕后解压缩放至任意目录下,将bin目录配置到path环境变量中
3)打开命令提示符,输入 protoc, 输出以下帮助内容说明安装成功
往下拉我们发现,可以生成c++,c#,java,js等语言代码,没有生成go的代码,我们需要把go语言的代码插件装进protoc里面
4)下面我们安装下go语言的代码插件
地址:https://github.com/grpc-ecosystem/grpc-gateway
下拉有Installation的说明,我们需要安装以下插件
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
安装完成后在$GOBIN目录下可以看到以下文件
protoc-gen-grpc-gateway
protoc-gen-openapiv2
protoc-gen-go
protoc-gen-go-grpc
5)将 %GOPATH%\bin 添加至path环境变量中
不加这一步,执行下边命令的时候会报错:
‘protoc-gen-go’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
–go_out: protoc-gen-go: Plugin failed with status code 1.
2. ProtoBuf的使用
1)使用vscode工具可以安装 vscode-proto3 扩展
2)新建proto文件,文件以 .proto 为拓展名
syntax = "proto3";
package server;
option go_package="server/proto/gen/go;trippb";
//复合类型
message Location {
double latitude = 1;
double longitude = 2;
}
//枚举类型
enum TripStatus {
TS_NOT_SPECIFIED = 0;
NOT_STARTED = 1;
IN_PROGRESS = 2;
FINISHED = 3;
PAID = 4;
}
message Trip {
string start = 1; //第一个字段是start
Location start_pos = 5;
repeated Location path_locations = 7; //repeated 切片
string end = 2;
Location end_pos = 6;
int64 duration_sec = 3;
int64 fee_cent = 4;
TripStatus status = 8;
}
3)创建gen目录,gen目录下创建go目录,我的目录结构为
4)新建终端,进入proto目录,执行以下命令
protoc -I . --go_out ./gen/go/ --go_opt paths=source_relative --go-grpc_out ./gen/go/ --go-grpc_opt paths=source_relative trip.proto
gen/go目录下会多出一个 trip.pb.go 文件
5)使用protoBuf进行通信,在外部新建一个go文件,引入trippb ,这个名称是我们创建trip.proto文件通过go_package定义的
package main
import (
"encoding/json"
"fmt"
trippb "myGoProject/server/proto/gen/go"
"google.golang.org/protobuf/proto"
)
func main() {
trip := trippb.Trip{
Start: "abc",
End: "def",
DurationSec: 3600,
FeeCent: 10000,
StartPos: &trippb.Location{
Latitude: 30,
Longitude: 120,
},
EndPos: &trippb.Location{
Latitude: 35,
Longitude: 115,
},
PathLocations: []*trippb.Location{
{
Latitude: 31,
Longitude: 119,
},
{
Latitude: 32,
Longitude: 118,
},
},
Status: trippb.TripStatus_IN_PROGRESS,
}
fmt.Println(&trip)
//转二进制流
b, err := proto.Marshal(&trip)
if err != nil {
panic(err)
}
fmt.Printf("%X\n", b)
//二进制流解码
var trip2 trippb.Trip
err = proto.Unmarshal(b, &trip2)
if err != nil {
panic(err)
}
fmt.Println(&trip2)
//转json串
b, err = json.Marshal(&trip2)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", b)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)