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的介绍、安装与使用 的相关文章

  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • Go 编译器有窗口化设置选项吗?

    我正在使用 Go 6g 编译 GTK 应用程序 我想知道是否有编译器 链接器选项使其成为 Windows 可执行文件而不是控制台可执行文件 MinGW 有一个 mwindows 选项来实现此目的 目前我必须使用十六进制编辑器手动更改 PE
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • 对嵌套结构使用自定义解组时,GoLang 结构无法正确解组

    我们需要对嵌套在多个其他结构中的结构使用自定义解组器 而这些结构不需要自定义解组器 我们有很多类似的结构B下面定义的结构 类似于嵌套A 代码的输出是true false 0 预期的true false 2 有任何想法吗 Go 游乐场示例he
  • 结构体到磁盘的高效 Go 序列化

    我的任务是将 C 代码替换为 Go 而且我对 Go API 还很陌生 我正在使用 gob 将数百个键 值条目编码到磁盘页面 但 gob 编码有太多不需要的膨胀 package main import bytes encoding gob f
  • ioutil.ReadFile - 没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 对于以下代码 package main import fmt io ioutil strings func main b err ioutil ReadFile shakespeare txt if err ni
  • 多个生产者,单个消费者:所有 goroutine 都在睡觉 - 死锁

    在继续工作之前 我一直遵循检查通道中是否有任何内容的模式 func consume msg lt chan message for if m ok lt msg ok fmt Println More messages m else bre
  • 不支持的 Perl 语法:`(?<`

    我想解析 cmd gpg list keys 的结果以将其显示在浏览器上 cmd输出是这样的 pub rsa3072 2021 08 03 SC expires 2023 08 03 07C47E284765D5593171C18F00B1
  • golang中默认的HTTP拨号超时值

    我正在运行 golang http 客户端来对服务器进行压力测试 有时我会收到错误 拨号 tcp 161 170 xx xxx 80 操作超时 错误 我认为这是 HTTP 客户端超时 我正在考虑增加超时值https stackoverflo
  • 是否可以将 Go 代码作为脚本运行?

    随着Go正在成为 系统 的语言 我想知道是否可以将 Go 代码作为脚本运行而不编译它 有可能这样做吗 动机 因为有关于动机的问题 取自如何使用 Scala 作为脚本语言 http alvinalexander com scala how t
  • 带有导出字段的私有类型

    在 Go 教程的第二天有这样的练习 为什么拥有带有导出字段的私有类型会很有用 例如 package geometry type point struct X Y int name string 请注意point是小写的 因此不会导出 而字段
  • 是否可以在 Golang 中 pickle 结构实例

    我正在 Golang 中做一些机器学习 我现在碰壁了 我训练有素的分类器需要将近半分钟的时间来训练 并且想要保存分类器的该实例 这样我就不必每次都从头开始训练 在 Golang 中应该如何去做呢 仅供参考 我的分类器是一个结构 当我用 py
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • 限制 FormFile 中的文件大小

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

随机推荐

  • 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文件被编译