Baste 发表于 2022-1-11 14:07

Golang Protobuf 安装并简单测试


protoc和protoc-go-gen 可以使用我云盘分享的安装包,拷贝到自己的可执行目录下测试, 也可以自己下载编译安装
两种方式如下
1. 直接使用安装包


云盘分享地址:链接:https://pan.baidu.com/s/1OuqIr3QqBMoDdn8O7fGR-w
提取码:t8er

image.png

2. 自己编译安装

安装protoc


打开 https://github.com/protocolbuffers/protobuf/releases

下载对应的安装包


image.png

[*]
解压并拷贝protoc到可执行目录下
如/usr/bin/下
执行protoc, 能看到输出信息表示成功
安装protoc-go-gen

git clone https://github.com/golang/protobuf.gitcd protoc-gen-go/// 编译安装 protoc-gen-go到$GOPATH/bin目录下go install3. 代码测试

编写proto文件


代码见 https://gitee.com/hufengjiu/go-zinx.git


新建项目目录如下


image.png


新建person.proto文件
syntax = "proto3";package pb;option go_package = "./mmo_game/pb"; // 生成文件所在目录//message为关键字,作用为定义一种消息类型message Person {    string name = 1; //姓名    int32 age = 2; //年龄    repeated string emails = 3; //电子邮件(repeated表示字段允许重复)    repeated PhoneNumber phones = 4; //手机号}//enum为关键字,作用为定义一种枚举类型enum PhoneType {    MOBILE = 0;    HOME = 1;    WORK = 2;}//message为关键字,作用为定义一种消息类型可以被另外的消息类型嵌套使用message PhoneNumber {    string number = 1;    PhoneType type = 2;}
在项目根目录执行命令
protoc -I ./--go_out=./ ./mmo_game/pb/*.proto

将会生成person.pb.go文件
image.png

编写main文件进行测试


image.png

执行 go get -v -u github.com/golang/protobuf/protoc-gen-go安装依赖包编写test_person.go文件
package mainimport (    "fmt"    "gitee.com/hufengjiu/go-zinx/mmo_game/pb"    "github.com/golang/protobuf/proto")func main() {    person := &pb.Person{      Name:   "小明",      Age:    16,      Emails: []string{"1234@qq.com", "5678@qq.com"},      Phones: []*pb.PhoneNumber{            &pb.PhoneNumber{                Number: "13113111311",                Type:   pb.PhoneType_MOBILE,            },            &pb.PhoneNumber{                Number: "14141444144",                Type:   pb.PhoneType_HOME,            },            &pb.PhoneNumber{                Number: "19191919191",                Type:   pb.PhoneType_WORK,            },      },    }    data, err := proto.Marshal(person)    if err != nil {      fmt.Println("marshal err:", err)    }    newPerson := &pb.Person{}    err = proto.Unmarshal(data, newPerson)    if err != nil {      fmt.Println("unmarshal err:", err)    }    fmt.Println(person)    fmt.Println(newPerson)}

[*]运行测试 go run test_person.go
结果
name:"小明" age:16 emails:"1234@qq.com" emails:"5678@qq.com" phones:{number:"13113111311"} phones:{number:"14141444144" type:HOME} phones:{number:"19191919191" type:WORK}name:"小明" age:16 emails:"1234@qq.com" emails:"5678@qq.com" phones:{number:"13113111311"} phones:{number:"14141444144" type:HOME} phones:{number:"19191919191" type:WORK}
至此成功
页: [1]
查看完整版本: Golang Protobuf 安装并简单测试