protobuf初识

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

protobuf

protobuf介绍

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

protobuf使用

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

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

protobuf语法

protobuf3语法指南

编译器安装

ptotoc

protobuf协议编译器是用c++编写的,根据自己的操作系统下载对应版本的protoc编译器:https://github.com/protocolbuffers/protobuf/releases,解压后拷贝到GOPATH/bin目录下。

protoc-gen-go

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

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

编写IDL代码

protobuf_demo/address目录下新建一个名为person.proto的文件具体内容如下:

// 指定使用protobuf版本
// 此处使用v3版本
syntax = "proto3"; // 包名,通过protoc生成go文件
package address; // 性别类型
// 枚举类型第一个字段必须为0
enum GenderType {
SECRET = 0;
FEMALE = 1;
MALE = 2;
} // 人
message Person {
int64 id = 1;
string name = 2;
GenderType gender = 3;
string number = 4;
} // 联系簿
message ContactBook {
repeated Person persons = 1;
}

生成go语言代码

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

address $ protoc --go_out=. ./person.proto

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

package main

import (
"fmt"
"io/ioutil" "github.com/golang/protobuf/proto" "github.com/Q1mi/studygo/code_demo/protobuf_demo/address"
) // protobuf demo func main() {
var cb address.ContactBook p1 := address.Person{
Name: "小王子",
Gender: address.GenderType_MALE,
Number: "7878778",
}
fmt.Println(p1)
cb.Persons = append(cb.Persons, &p1)
// 序列化
data, err := proto.Marshal(&p1)
if err != nil {
fmt.Printf("marshal failed,err:%v\n", err)
return
}
ioutil.WriteFile("./proto.dat", data, 0644) data2, err := ioutil.ReadFile("./proto.dat")
if err != nil {
fmt.Printf("read file failed, err:%v\n", err)
return
}
var p2 address.Person
proto.Unmarshal(data2, &p2)
fmt.Println(p2)
}

最新文章

  1. dom中一些节点获取和增改
  2. Could not load file or assembly or one of its dependencies. 试图加载格式不正确的程序。
  3. sqlserver添加表、字段注释
  4. Java中将0x开头的十六进制字符串转换成十进制整数
  5. SharePoint 2013 Nintex Workflow 工作流帮助(七)
  6. C++ const使用详解
  7. php 扩展编译linux
  8. 调试minix内核
  9. Seafile安装踩坑
  10. 查看ntp时间是否同步
  11. 同时安装多个的Mysql的实现方法
  12. 微信小程序——报错汇总
  13. 将linux系统目录挂载到其他分区,扩大系统可用空间
  14. webpack 中,module、chunk、bundle 的区别(待补充)
  15. 关于IE 浏览器的position居中定位的问题和 行块元素的设置问题
  16. (转)web.xml中的contextConfigLocation在spring中的作用
  17. DOM文档对象模型简介
  18. 服务器保存所有用户的操作指令(history)
  19. 树型结构递归 实体递归 JSON格式
  20. java简单的邮件发送

热门文章

  1. Ubuntu 20.04 简述环境配置&美化
  2. 使用defineProperty实现自定义setter, 简化前端Angular的重构工作
  3. 1040 Longest Symmetric String
  4. C - The Suspects POJ - 1611(并查集)
  5. phpstorm2017 激活方法
  6. hdu3415单调队列
  7. WPF之自定义委托命令
  8. 【pytest系列】- fixture测试夹具详解
  9. 分布式事务与Seate框架(1)——分布式事务理论
  10. Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件