在go语言中安装与使用protobuf的方法详解

发布时间 - 2026-01-11 02:48:04    点击率:

简介

本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

protobuf是Google开发出来的一个语言无关、平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用。通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构。这就是protobuf神奇的地方。并且,它的通信效率极高,“一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一”。

安装

编译安装protobuf的编译器protoc

  wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
  tar zxvf protobuf-2.6.1.tar.gz
  cd protobuf-2.6.1./configure
  make
  make install

        执行 protoc  -h 查看安装是否成功

安装插件 protoc-gen-go,它是一个go程序,编译它之后将可执行文件执行路径写入环境变量

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

获取proto包

go get github.com/golang/protobuf/proto

在go中使用

protobuf的使用方法是将数据结构写入到.proto文件中,使用protoc编译器编译(间接使用了插件)得到一个新的go包,里面包含go中可以使用的数据结构和一些辅助方法。

编写test.proto文件

 package example;
 
 enum FOO { X = 17; };
 
 message Test {
  required string label = 1;
  optional int32 type = 2 [default=77];
  repeated int64 reps = 3;
  optional group OptionalGroup = 4 {
  required string RequiredField = 5;
  }
 }

    编译:

    执行 protoc --go_out=. *.proto 生成 test.pb.go 文件

    将test.pb.go文件放入example文件夹(对应上面package)中,作为example包

try

 package main

 import (
  "log"

  "github.com/golang/protobuf/proto"
  "example"
 )

 func main() {
  test := &example.Test {
   Label: proto.String("hello"),
   Type: proto.Int32(17),
   Reps: []int64{1, 2, 3},
   Optionalgroup: &example.Test_OptionalGroup {
    RequiredField: proto.String("good bye"),
   },
  }
  data, err := proto.Marshal(test)
  if err != nil {
   log.Fatal("marshaling error: ", err)
  }
  newTest := &example.Test{}
  err = proto.Unmarshal(data, newTest)
  if err != nil {
   log.Fatal("unmarshaling error: ", err)
  }
  // Now test and newTest contain the same data.
  if test.GetLabel() != newTest.GetLabel() {
   log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
  }
  //test.GetOptionalgroup().GetRequiredField()
  //etc
 }

一些对应关系

  • message Test对为 struct 结构,其属性字段有了对应的get方法,在go中可以使用test.GetLabel()test.GetType()获取test对象的属性
  • OptionalGroup对应为 struct中的内嵌struct
  • proto文件中repeated属性对于slice结构
  • test.Reset()可以使其所有属性置为0值
  • 使用Marshal和Unmarshal可以轻松的编码和解码

这些只是一些特性,想要仔细研究可以查看github上的wiki:https://github.com/golang/protobuf

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# go  # protobuf  # 使用  # 生成go  # Go语言结合grpc和protobuf实现去中心化的聊天室  # Go语言使用protojson库实现Protocol Buffers与JSON转换  # Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结  # go语言中proto文件的使用  # 数据结构  # 可以使用  # 序列化  # 服务端  # 的是  # 客户端  # 相关内容  # 说了  # 这就是  # 不多  # 它是  # 给大家  # 使其  # 这篇文章  # 极高  # 谢谢大家  # 转化为  # 将可  # 可以查看  # 就可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何为API编写文档_Laravel API文档生成与维护方法  制作电商网页,电商供应链怎么做?  如何在IIS7上新建站点并设置安全权限?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何用腾讯建站主机快速创建免费网站?  如何彻底卸载建站之星软件?  简单实现jsp分页  如何在阿里云服务器自主搭建网站?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  ,南京靠谱的征婚网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel如何创建自定义Facades?(详细步骤)  Python文件操作最佳实践_稳定性说明【指导】  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在宝塔面板中修改默认建站目录?  微信小程序 HTTPS报错整理常见问题及解决方案  EditPlus中的正则表达式 实战(4)  如何在云主机快速搭建网站站点?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何用AI帮你把自己的生活经历写成一个有趣的故事?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Bootstrap整体框架之JavaScript插件架构  实现点击下箭头变上箭头来回切换的两种方法【推荐】  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  海南网站制作公司有哪些,海口网是哪家的?  原生JS实现图片轮播切换效果  Linux系统命令中tree命令详解  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何续费美橙建站之星域名及服务?  Python制作简易注册登录系统  Laravel怎么实现模型属性的自动加密  如何用已有域名快速搭建网站?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  公司网站制作价格怎么算,公司办个官网需要多少钱?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Python进程池调度策略_任务分发说明【指导】  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面