protoc和protoc-go-gen 可以使用我云盘分享的安装包,拷贝到自己的可执行目录下测试, 也可以自己下载编译安装
两种方式如下
1. 直接使用安装包
image.png云盘分享地址: 链接:https://pan.baidu.com/s/1OuqIr3QqBMoDdn8O7fGR-w
提取码:t8er
2. 自己编译安装
安装protoc
-
下载对应的安装包
image.png -
解压并拷贝protoc到可执行目录下
如/usr/bin/
下 -
执行protoc, 能看到输出信息表示成功
安装protoc-go-gen
git clone https://github.com/golang/protobuf.git
cd protoc-gen-go/
// 编译安装 protoc-gen-go到$GOPATH/bin目录下
go install
3. 代码测试
编写proto文件
-
新建项目目录如下
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 main
import (
"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}
至此成功
网友评论