protobuf是一种高效的数据格式,平台无关、语言无关、可扩展,可用于 RPC 系统和持续数据存储系统。

protobuf介绍

Protobuf是Protocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC接口的基础工具。

protobuf使用

protobuf是一个与语言无关的一个数据协议,所以我们需要先编写IDL文件然后借助专用工具生成指定语言的代码,从而实现数据的序列化与反序列化过程。

大致开发流程如下: 1. IDL编写 2. 生成指定语言的代码 3. 序列化和反序列化

protobuf语法

官网:https://developers.google.cn/protocol-buffers/docs/proto3 (英文)

三方:https://colobu.com/2017/03/16/Protobuf3-language-guide (中文)

编译器安装

ptotoc

mac安装:

  1. brew info protobuf

cdn下载:(下载需要的版本)

cdn下载链接

linux/mac 编译安装

教程

protoc-gen-go

安装生成Go语言代码的工具

两个版本:

  • github版本 github.com/golang/protobuf/protoc-gen-go
  • google版本 google.golang.org/protobuf/cmd/protoc-gen-go

区别在于前者是旧版本,后者是google接管后的新版本,他们之间的API是不同的,也就是说用于生成的命令,以及生成的文件都是不一样的。

因为目前的gRPC-go源码中的example用的是后者的生成方式,为了与时俱进,本文也采取最新的方式。

安装:

  1. go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
  2. go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

编写IDL代码

新建一个名为person.proto的文件具体内容如下:

  1. // 指定使用protobuf版本
  2. // 此处使用v3版本
  3. syntax = "proto3";
  4. // 包名,通过protoc生成go文件
  5. package address;
  6. // go的包名 新版protoc-gen-go 必须带"/"
  7. option go_package = "../hello";
  8. // 性别类型
  9. // 枚举类型第一个字段必须为0
  10. enum GenderType {
  11. SECRET = 0;
  12. FEMALE = 1;
  13. MALE = 2;
  14. }
  15. // 人
  16. message Person {
  17. int64 id = 1;
  18. string name = 2;
  19. GenderType gender = 3;
  20. string number = 4;
  21. }
  22. // 联系簿
  23. message ContactBook {
  24. repeated Person persons = 1;
  25. }

生成go语言代码

在protobuf_demo/address目录下执行以下命令。

  1. protoc --proto_path=./ --go_out=./ ./person.proto
  • --proto_path: 指定了要去哪个目录中搜索import中导入的和要编译为.go的proto文件
  • --go_out:指定了生成的go文件的目录,我在这里把go文件放到本目录中
  • person.proto, 定义了我要编译的文件是哪个文件。

此时在当前目录下会生成一个person.pb.go文件,我们的Go语言代码里就是使用这个文件。 在protobuf_demo/main.go文件中:

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "z/test3/person"
  6. "github.com/golang/protobuf/proto"
  7. )
  8. func main() {
  9. var cb person.ContactBook
  10. p1 := person.Person{
  11. Name: "zhao",
  12. Gender: person.GenderType_MALE,
  13. Number: "12345678910",
  14. }
  15. fmt.Println(p1)
  16. cb.Persons = append(cb.Persons, &p1)
  17. data, err := proto.Marshal(&p1)
  18. if err != nil {
  19. fmt.Printf("marshal failed,err:%v\n", err)
  20. return
  21. }
  22. ioutil.WriteFile("./proto.dat", data, 0644)
  23. data2, err := ioutil.ReadFile("./proto.dat")
  24. if err != nil {
  25. fmt.Printf("read file failed, err:%v\n", err)
  26. return
  27. }
  28. var p2 person.Person
  29. proto.Unmarshal(data2, &p2)
  30. fmt.Println(p2)
  31. }

参考文章:https://www.liwenzhou.com/posts/Go/protobuf/

proto buffer的更多相关文章

  1. google proto buffer安装和简单示例

    1.安装 下载google proto buff. 解压下载的包,并且阅读README.txt,根据里面的指引进行安装. $ ./configure $ make $ make check $ mak ...

  2. Google proto buffer的安装/使用

    protobuf安装/使用原本是要在官网上下载的:http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz可惜已被墙,幸好有好心人提供了以下 ...

  3. google protocol buffer 简介 版本 安装 使用 实例

    一.简介 protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了三种语言的实现:java.c++ 和 python,每一种实现 ...

  4. protoc-gen-lua

    lua里使用proto buffer protoc-gen-lua 官方不维护了,自己维护个:protoc-gen-lua int64支持,将64位int转换成lua的string. message相 ...

  5. RChain节点通信机制(上)

    在介绍RChain的通信机制之前,先简单介绍一些以太坊的通信机制,它包括以下几个方面,如下详细了解以太坊的通信机制,可以查看https://github.com/ethereum/devp2p/blo ...

  6. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  7. gPRC学习笔记

    gPRC学习笔记 gPRC基础教程. gPRC官方文档. protobuf 3.0的简易教程. 什么是RPC RPC(remote procedure call) -- 远程过程调用(相对于本地调用的 ...

  8. TensorFlow 运行模型--会话(Session)

    会话模式一: 需要明确调用会话生成函数和关闭函数 # 创建一个会话 sess = tf.Session() # 使用创建好的会话进行运算 sess.run("要运算的对象") # ...

  9. HBase实战 | 知乎实时数仓架构演进

    https://mp.weixin.qq.com/s/hx-q13QteNvtXRpNsE5Y0A 作者 | 知乎数据工程团队编辑 | VincentAI 前线导读:“数据智能” (Data Inte ...

随机推荐

  1. Codeforces Round #735 (Div. 2) 题解

    比赛地址:https://codeforces.com/contest/1554. 只有 ABCD 的题解,E 不会. A 答案是 \(\max_i\{a_ia_{i+1}\}\).证明:(反证)如果 ...

  2. 斐波那契数列——Python实现

      # 功能:求斐波那契数列第 n 个数的值 # 在此设置 n n = 30 print('\n');print('n = ',n) # 代码生成 Fibonacci 序列,存于数组A A = [0] ...

  3. Go通关03:控制结构,if、for、switch逻辑语句

    if 条件语句 func main() { i:=6 if i >10 { fmt.Println("i>10") } else if i>5 && ...

  4. AppWeb认证绕过漏洞(CVE-2018-8715)

    影响范围 Appweb 7.0.2及早期版本. 复现 构造头Authorization: Digest username=admin 返回包里包含session 发送POST请求,添加session到 ...

  5. 数据结构算法学习之队列(数组模拟java实现)

    数组模拟队列 数组模拟队列 今天学习数组模拟队列.队列常用于生活中的方方面面.比如银行叫号排队.实际上就是队列.所有人抽号排队.先去的先抽号.所以靠前的号最后会先被叫到然后出队.后边的会随之往前移位. ...

  6. .NET 6 预览版 7 发布——最后一个预览版

    原文:bit.ly/2VJxjxQ 作者:Richard 翻译:精致码农-王亮 说明:文中有大量的超链接,这些链接在公众号文章中被自动剔除,一部分包含超链接列表的小段落被我删减了,如果你对此感兴趣,请 ...

  7. 网安日记④之搭建域环境(domain)并且配置域

    搭建域环境(domain)并且配置域 什么是域 域就是将多台计算机在逻辑上组织到一起,进行集中管理,也就是创建在域控制器上的组,将组的账户信息保存在活动目录中.域组可以用来控制域内任何一台计算机资源的 ...

  8. 四、C#简单操作MinIO

    MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO He ...

  9. 分时函数 & 节流函数

    分时函数 & 节流函数 1.函数节流 JavaScript 中的函数大多数情况下都是由用户主动调用触发的,除非是函数本身的实现不合 理,否则我们一般不会遇到跟性能相关的问题.但在一些少数情况下 ...

  10. zookeeper查看启动状态报错:Error contacting service. It is probably not running.

    问题描述 我有三台虚拟机master.slave1.slave2.每台虚拟机启动zkServer.sh时都没有报错,然后紧接着查看zkServer.sh的状态,这时候出现了错误:Error conta ...