go protobuf安装与使用

go protobuf安装与使用,第1张

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-gatewayprotoc-gen-openapiv2protoc-gen-goprotoc-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)

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/996159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存