protobuf初识
更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11517502.html
protobuf是一种高效的数据格式,平台无关、语言无关、可扩展,可用于 RPC 系统和持续数据存储系统。
一、protobuf
1.1 protobuf介绍
Protobuf是Protocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC接口的基础工具。
1.2 protobuf使用
protobuf是一个与语言无关的一个数据协议,所以我们需要先编写IDL文件然后借助专用工具生成指定语言的代码,从而实现数据的序列化与反序列化过程。
大致开发流程如下:
1. IDL编写
2. 生成指定语言的代码
3. 序列化和反序列化
1.3 protobuf语法
1.4 编译器安装
1.5 ptotoc
protobuf协议编译器是用c++编写的,根据自己的操作系统下载对应版本的protoc编译器:https://github.com/protocolbuffers/protobuf/releases,解压后拷贝到GOPATH/bin目录下。
1.6 protoc-gen-go
安装生成Go语言代码的工具
go get -u github.com/golang/protobuf/protoc-gen-go
1.7 编写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目录下执行以下命令。
```bash
address $ protoc --go_out=. ./person.proto
```
此时在当前目录下会生成一个person.pb.go文件,我们的Go语言代码里就是使用这个文件。
在protobuf_demo/main.go文件中:
```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)
}
```
protobuf初识的更多相关文章
- 第三方数据格式库protobuf
protobuf初识 protobuf是一种高效的数据格式,平台无关.语言无关.可扩展,可用于 RPC 系统和持续数据存储系统. protobuf protobuf介绍 Protobuf是Protoc ...
- Go从入门到放弃
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
- Go语言学习之路
我关于Go语言的博客原本发布于我的个人网站:wwww.liwenzhouu.com.但是被某些人抄怕了,没办法只好搬运到博客园. 我的Go语言学习之路 2015年底我因为工作原因接触到了Go语言,那时 ...
- GO语言开发之路
Go语言开发之路 介绍 为什么学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基础之 ...
- Go语言之路—博客目录
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
- GOOGLE PROTOBUF开发者指南
原文地址:http://www.cppblog.com/liquidx/archive/2009/06/23/88366.html 译者: gashero 目录 1 概览 1.1 什么是pro ...
- protobuf标准消息方法
protobuf标准消息方法 1.标准消息方法 每个消息类包含一些其他方法允许你检查和控制整个消息,包括: · IsInitialized() :检查是否所有必须(required)字段都已经被赋值了 ...
- ProtoBuf - Arena
1.概述 最近看 Protocal Buffer 的源码,初次见到这个库源自陈硕的 muduo ,便打算看一看,在此做一下记录.官网文档不能访问,只能凭借代码的自己理解,查看的源码版本为 3.6.0. ...
- ProtoBuf开发者指南
目录 1 概览 1.1 什么是protocol buffer 1.2 他们如何工作 1.3 为什么不用XML? 1.4 听起来像是为我的解决方案,如何开始? 1.5 一点历史 ...
随机推荐
- jdk安装及环境配置
1.下载对应的安装包(我们公司用的是jdk 1.8) 2.选择对应版本,点击安装,在选择安装位置的时候,选择自己对应存放的位置,其他都点击下一步就行了,先安装jdk,后安装jre 3.环境变量,选择 ...
- JVM解剖乐园
1.JVM锁粗化和循环原文标题:JVM Anatomy Quark #1: Lock Coarsening and Loops 众所周知Hotsport编译器会进行JVM锁粗化和优化,它将相邻的锁区块 ...
- 逛公园[NOIP2017 D2 T3](dp+spfa)
题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边.其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条 ...
- 最小环-Floyd
floyd求最小环 在Floyd的同时,顺便算出最小环. Floyd算法 :k<=n:k++) { :i<k:i++) :j<k:j++) if(d[i][j]+m[i][k]+m[ ...
- 分布式任务队列--Celery的学习笔记
一.Celery简介 Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具.它是一个任务队列,专注于实时处理,同时还支持任务调度. 所谓任务队列,是一 ...
- .net core 在 Docker 开发下的巨坑
一,Docker 的安装 Windows 安装 Docker 官方文档: https://docs.microsoft.com/zh-cn/virtualization/windowscontain ...
- three.js基础前置知识
这一节是纯理论知识,用于介绍three.js的入门概念,也就是开发前需要准备的理论基础. 一,三剑客 当然就是scene,camera,renderer这三个基本要素. scene是一个用于容纳三维空 ...
- HTTP head请求
GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体. PUT: 从客户端向服务器传送的数据取代指定 ...
- Spring框架之JdbcTemplate
Spring框架之JdbcTemplate 一.JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到Jd ...
- Linux shell 内部命令与外部命令有什么区别以及怎么辨别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...