1、下载protobuf的编译器protoc

地址:

https://github.com/google/protobuf/releases

window:
    下载: protoc-3.3.0-win32.zip
    解压,把bin目录下的protoc.exe复制到GOPATH/bin下,GOPATH/bin加入环境变量。
    当然也可放在其他目录,需加入环境变量,能让系统找到protoc.exe
linux:
    下载:protoc-3.3.0-linux-x86_64.zip 或 protoc-3.3.0-linux-x86_32.zip
    解压,把bin目录下的protoc复制到GOPATH/bin下,GOPATH/bin加入环境变量。
    如果喜欢编译安装的,也可下载源码自行安装,最后将可执行文件加入环境变量。

2、获取protobuf的编译器插件protoc-gen-go
    进入GOPATH目录
    运行

> go get -u github.com/golang/protobuf/protoc-gen-go

如果成功,会在GOPATH/bin下生成protoc-gen-go.exe文件

3、创建一个test.proto文件

//指定版本
//注意proto3与proto2的写法有些不同
syntax = "proto3"; //包名,通过protoc生成时go文件时
package test; //手机类型
//枚举类型第一个字段必须为0
enum PhoneType {
HOME = 0;
WORK = 1;
} //手机
message Phone {
PhoneType type = 1;
string number = 2;
} //人
message Person {
//后面的数字表示标识号
int32 id = 1;
string name = 2;
//repeated表示可重复
//可以有多个手机
repeated Phone phones = 3;
} //联系簿
message ContactBook {
repeated Person persons = 1;
}

4、运行如下命令

> protoc --go_out=. *.proto

会生成一个test.pb.go的文件,具体的文件内容我就不截图了。

5、在go语言中使用protobuf

package main;

import (
"github.com/golang/protobuf/proto"
"protobuf/test"
"io/ioutil"
"os"
"fmt"
) func write() {
p1 := &test.Person{
Id: 1,
Name: "小张",
Phones: []*test.Phone{
{test.PhoneType_HOME, "111111111"},
{test.PhoneType_WORK, "222222222"},
},
};
p2 := &test.Person{
Id: 2,
Name: "小王",
Phones: []*test.Phone{
{test.PhoneType_HOME, "333333333"},
{test.PhoneType_WORK, "444444444"},
},
}; //创建地址簿
book := &test.ContactBook{};
book.Persons = append(book.Persons, p1);
book.Persons = append(book.Persons, p2); //编码数据
data, _ := proto.Marshal(book);
//把数据写入文件
ioutil.WriteFile("./test.txt", data, os.ModePerm);
} func read() {
//读取文件数据
data, _ := ioutil.ReadFile("./test.txt");
book := &test.ContactBook{};
//解码数据
proto.Unmarshal(data, book);
for _, v := range book.Persons {
fmt.Println(v.Id, v.Name);
for _, vv := range v.Phones {
fmt.Println(vv.Type, vv.Number);
}
}
} func main() {
write();
read();
}

最新文章

  1. 改变word的语言字典
  2. NET中的Memcached.ClientLibrary使用详解
  3. (转)Java中的static关键字解析
  4. python之装饰器
  5. glide 加载圆角图片
  6. 坑死我啊,一个WPF Adorner使用注意事项
  7. Iptables 规则 一些简单实例和详细介绍
  8. datagridview 不显示行号的问题
  9. Y2错题解析
  10. 十二个 ASP.NET Core 例子——中间件
  11. 17-TypeScript代理模式
  12. [HNOI 2001]软件开发
  13. vultr测速 看看vultr哪个地区节点速度快
  14. 解决eclipse使用tomcat启动项目后访问项目404的问题
  15. Perl面向对象(1):从代码复用开始
  16. Codeforces986C AND Graph 【位运算】【dfs】
  17. keepalived 工作原理
  18. python计算最大公约数和最小公倍数
  19. tcp echo server libuv
  20. Sitecore 9有什么新功能

热门文章

  1. cache verilog实现
  2. loadrunner安装和应用
  3. Tomcat服务器编码格式设置
  4. metrics-server 安装问题解决
  5. mongo find 时间条件过滤
  6. centos7安装docker-compose报错解决办法
  7. 关于std::bind的文章收集
  8. uiautomatorviewer
  9. scapy构造数据包
  10. 面向对象高级A(反射,拦截方法)