protobuf的介绍、安装与使用

2023-11-09

1.protobuf是什么?

   protobuf是google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一 proto文件被编译成不同的语言版本,加入到各自的工程中去。这样不同语言就可以解析其他语言通过 protobuf序列化的数据。

2.数据交互xml、json、protobuf格式比较
(1)json: 一般的web项目中,最流行的主要还是json。因为浏览器对于json数据支持非常好,有很多内建的函数支持。
(2)xml: 在webservice中应用最为广泛,但是相比于json,它的数据更加冗余,因为需要成对的闭合标签。json使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。
(3)protobuf:是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。
 
3.相对于其它protobuf更具有优势
  (1) 序列化后体积相比Json和XML很小,适合网络传输
  (2) 支持跨平台多语言
  (3) 消息格式升级和兼容性还不错
  (4) 序列化反序列化速度很快,快于Json的处理速速

4.protobuf安装

(1)下载 protobuf安装包
          $ git clone https://github.com/protocolbuffers/protobuf.git
(2)安装依赖库
          $ sudo apt-get install autoconf automake libtool curl make g++ unzip libffi-dev -y
(3)安装
          $ cd protobuf/
          $ ./autogen.sh
          $ ./configure
          $ make
          $ sudo make install
          $ sudo ldconfig                  // 刷新共享库,很重要的一步
(4)测试一下是否安装成功  

         $ protoc –h

(5)获取 proto包(Go语言的proto API接口)
         $ go get -v -u github.com/golang/protobuf/proto

(6)进入GOPATH/src/github.com/golang/protobuf/protoc-gen-go目录下,打开终端,输入:
         $ go build

  (7)将build生成的protoc-gen-go可执行文件复制到/bin目录下
         $ sudo cp protoc-gen-go /bin/

5.protobuf的语法

    写一个简单的example..proto文件,如下:

          

    文件的第一行指定了你正在使用proto3语法:如果你没有指定这个,编译器会使用proto2。这个指定语法行必须是文件的非空非注释的第一个行。 

  在上面的例子中,所有字段都是标量类型:两个整型(height和weight),一个string类型(name)。Repeated 关键字表示重复,那么在go语言中用切片进行代表。

  对go来说,编译器会为每个消息类型生成了一个.pd.go文件。可以通过定义好的.proto文件来生成Java,Python,C++, Ruby, JavaNano, Objective-C,或者C# 代码,需要基于.proto文件运行protocol buffer编译器protoc。

  通过如下方式调用protocol编译器:

  如下,进入example.proto文件同一目录下,输入protoc --go_out=./ *.proto ,就会在当前目录下生成一个example.pb.go文件:                    

  接下来,我们打开example.pb.go文件,看看里面的内容:

               

6.protobuf的golang调用测试

      (1)在protobuf目录下再创建一个test1目录,进入test1目录下,创建一个test1.proto文件,内容如下:

            

      (2)调用protocol编译器,输入protoc --go_out=./ *.proto ,生成test1.pb.go文件:

          

      (3)在protobuf目录下再创建一个go-test1目录,进入go-test1目录下,创建一个test1.go文件,内容如下:

package main

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	"protobuf/test1"
)

func main()  {
	test := &protobuf.Test{
		Name:"sxf",
		Weight:[]int32{120,144,200,170,140},
		Height:180,
		Motto:"鸡你太美",
	}
	fmt.Println(test)

	data,err := proto.Marshal(test) //proto编码
	if err != nil{
		fmt.Println("编码失败")
	}
	fmt.Println(data)  //编码后打印

	//proto的解码
	newtest := &protobuf.Test{}
	err = proto.Unmarshal(data,newtest)
	if err != nil{
		fmt.Println("解码失败")
	}
	fmt.Println(newtest)  //解码后打印
	fmt.Println(newtest.String()) //转成字符串

	fmt.Println("名字:",newtest.Name)
	fmt.Println("体重的变化:",newtest.Weight)
	fmt.Println("身高:",newtest.Height)
	fmt.Println("格言:",newtest.Motto)
}

      (4)运行test1.go,查看运行结果: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf的介绍、安装与使用 的相关文章

  • golang中默认的HTTP拨号超时值

    我正在运行 golang http 客户端来对服务器进行压力测试 有时我会收到错误 拨号 tcp 161 170 xx xxx 80 操作超时 错误 我认为这是 HTTP 客户端超时 我正在考虑增加超时值https stackoverflo
  • Golang:使用像 Node.js 中那样的可读流从 PostgreSQL 数据库中选择几百万行

    我有大约 5000 万行的 PostgreSQL 表 我想编写 Go 代码来从该表中选择大约 100 万行 并以有效的方式处理它们 上次我使用了nodejs和这个NPM模块pg 查询流 https www npmjs com package
  • 模块路径格式错误...第一个路径元素中缺少点

    我有一个包含 2 个不同可执行文件的项目 每个可执行文件都有自己的依赖项以及对根的共享依赖项 如下所示 Root gt server gt main go gt someOtherFiles go gt go mod gt go sum g
  • 防止使用 golang 服务器访问文件夹中的文件

    我在 golang 中有一个服务器可以处理这样的文件夹路径 fs http FileServer http Dir assets http Handle Images fs http ListenAndServe 8000 nil 但在这个
  • 限制 FormFile 中的文件大小

    我让用户使用 FormFile 上传文件 我应该在什么时候检查文件大小是否太大 当我做 file header fileErr r FormFile file 文件对象已经创建 那么我是否已经产生了读取整个文件的成本 https golan
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • 当变量更新时动态刷新模板的一部分golang

    在Golang中 当变量更新时可以刷新模板的一部分吗 例如 我们可以在 Angular js 中找到这一点 基本上在我的代码中 我通过 ajax 中的邮政编码查找地址 它显示我找到的该邮政编码的用户列表 Here is a sample o
  • 如何在 Visual Studio Code 中为 Golang 启用竞争检测器?

    我搜索了很多网页来找到我应该放入哪个短语settings json在 VS Code Golang 扩展 由 Microsoft 发布 中添加构建标志 在我的例子中是竞赛检测器 I added go buildFlags race 在扩展名
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • Gorm 总是返回带有 nil 值的结构

    我正在使用 Gorm 构建 Go Web API 作为 Amazon RDS 中 Postgresql 数据库的 ORM 问题是 Gorm 总是返回一片结构 其值全部为零 尽管数据库已经填充了数据 切片中的结构体数量是否合适取决于LIMIT
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1
  • Golang中如何获得100%的代码覆盖率? [复制]

    这个问题在这里已经有答案了 我无法获得 100 的代码覆盖率 因为我无法在 Golang 中测试 Fatals 我发现了一些问答 包括this one https stackoverflow com questions 30688554 h

随机推荐

  • 51单片机控制SG90舵机、MG90S舵机

    舵机的控制信号为周期是20ms 的脉宽调制 PWM 信号 其中脉冲宽度从0 5ms 2 5ms 相对应舵盘的位置为0 180度 呈线性变化 也就是说 给它提供一定的脉宽 它的输出轴就会保持在一个相对应的角度上 无论外界转矩怎样改变 直到给它
  • JavaScript 中的 SOLID 原则

    什么是 SOLID SOLID 是 Robert C Martin 的前五个面向对象设计原则的首字母缩写词 这些原则的目的是 让你的代码 架构更具可读性 可维护性 灵活性 单一职责原则 Single Responsibility Princ
  • 关于Java中Arrays.sort()的几种用法

    复习了Java数组之后 突然Arrays里面有一个sort是针对数组排序的 然后就看了看它的简单用法 Java的Arrays类中有一个sort 方法 该方法是Arrays类的静态方法 在需要对数组进行排序时 非常的好用 但是sort 的参数
  • mongo在linux下的安装(实践记录)

    mongo在linux下的安装 1 到官方网站下载需要安装的mongo版本 下载mongo对应的版本 官网为 http www mongodb org downloads 本人用的是公司的版本 mongodb linux x86 64 1
  • mysql如何设置自动增长id列

    参考 https blog csdn net WxQ92222 article details 79956403 我使用的是navicat软件来可视化mysql 实际上navicat可以直接设置自动增长的 在设计表时只要添加类型为int或b
  • linux添加新LUN,无需重启

    author skate time 2011 12 12 linux添加新LUN 无需重启 在给存储增加新的Lun时 在linux下一般是 A 重启操作系统 B 重启HBA卡驱动 1 kudzu 添加完新硬盘后 运行命令kudzu重新扫描新
  • TCP/UDP端口对应(转)

    常用端口编号 0 TCP UDP 保留端口 不使用 若发送过程不准备接受回复消息 则可以作为源端口 1 TCP UDP TCPMUX 传输控制协议端口服务多路开关选择器 5 TCP UDP RJE 远程作业登录 7 TCP UDP ECHO
  • Fiddler手机抓包方法及添加代理后连不上网解决

    Fidder手机抓包要保证电脑和手机在同一个局域网内 电脑端使用ipconfig查看ip地址 1 Fiddle给手机添加代理 Tools gt Options 2 手机添加代理 对应wifi点击高级选项 gt 代理 手动 gt 设置代理主机
  • css div layout,CSS布局指南

    特别声明 本文根据 Rachel Andrew的 Getting Started With CSS Layout 一文整理 在过去几年中 CSS布局已经发生了巨大的变化 现在我们开发网站的方式也发生了巨大变化 现在我们有需要可选的CSS布局
  • css3鼠标悬停动画线条边框特效

    鼠标滑过边框动画效果 使用css3结合jquery 此效果和代码是早些年最早刚接触c3动画时写的 当年写出它来别有一番成就感呢 所以记忆尤新 哈哈哈哈 早些年从不感兴趣这些写文章 管理博客之类的 现在拿出来分享给刚接触动画的小盆友们参考 先
  • 解析

    隐私数据密文控制权只能由单一主体掌控 代表控制权的密钥如何才能安全地交由多个互不信任的主体协同使用 如何在技术层面保障多方授权的公平公正性 任一参与协作的主体密钥丢失 如何实现安全可靠的容灾恢复 在业务方案设计中 安全可控地让多个隐私主体参
  • python中的->和@

    gt gt 常常出现在python函数定义的函数名后面 为函数添加元数据 描述函数的返回类型 从而方便开发人员使用 如 def add x y gt int return x y 这里面 元数据表明了函数的返回值为int类型 这样做的好处是
  • 【Qt】QImage使用总结

    图像格式转换 由 RGB 格式转换成 BGR 格式 QImage rgbSwapped 返回一个QImage 其中所有像素的红色和蓝色组件的值被交换 有效地将RGB图像转换为BGR图像 QImage image fileName QImag
  • 阿里巴巴0322晚春招实习笔试算法题解析 --- sort函数的用法与第二题:数组重排

    sort first last 对容器或普通数组中 first last 范围内的元素进行排序 默认进行升序排序 sort 函数是基于快速排序实现的 sort 只对 array vector deque 这 3 个容器提供支持 默认升序排序
  • Sqli-labs Less09-10 延时型sql盲注 - GET

    本文记录 SQL 注入的学习过程 资料为 SQLi SQLi 博客目录 Less 09 GET Blind Time based Single Quotes 测试漏洞 本关我们从标题就可以看到 基于时间 单引号 所以很明显的这关要我们利用延
  • docker下查看删除kafka下topic

    在公司的项目中需要用到kafka和c 进行消息发送 有一天不知道为啥 下端就出现一直读取消息的问题 所以得清空通道内的消息 1 docker ps 获取到当前kafka的容器id 673e6f1401c7 docker ps a 可以查看所
  • 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc

    DataFrame赋值时报错 A value is trying to be set on a copy of a slice from a DataFrame Try using loc row indexer col indexer v
  • vscode提取扩展时出错XHR tiemout:undefinedms,如何解决?

    问题 vscode提取扩展时出错XHR tiemout undefinedms 如何解决 电脑重启了 断网重新连接了 都不行 解答 该错误通常表示 VS Code 扩展商店的连接超时 可能是网络问题导致的 您可以尝试以下几种方法 检查网络连
  • 一维码EAN 13简介及其解码实现(zxing-cpp)

    一维码EAN 13 属于国际标准条码 由13个数字组成 为EAN的标准编码型式 EAN标准码 依结构的不同 EAN条码可区分为 1 EAN 13码 由13个数字组成 为EAN的标准编码型式 EAN标准码 2 EAN 8码 由8个数字组成 属
  • protobuf的介绍、安装与使用

    1 protobuf是什么 protobuf是google旗下的一款平台无关 语言无关 可扩展的序列化结构数据格式 所以很适合用做数据存储和作为不同应用 不同语言之间相互通信的数据交换格式 只要实现相同的协议格式即同一 proto文件被编译