Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现

Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现

作者头像
飞雪无情
发布于 2020-06-23 05:37:44
发布于 2020-06-23 05:37:44
3.2K00
代码可运行
举报
运行总次数:0
代码可运行

ProtoBuf最近几年也算比较流行,它是一种语言无关,平台无关,并且可以扩展,并结构数据序列化的方法。相比JSON/XML这类文本格式的,ProtoBuf是二进制的,更快更高效。对于这么好的特性,Gin当然是支持的。

通过这篇文章你可以学到:

  1. ProtoBuf数据结构
  2. ProtoBuf对象如何生成Golang代码
  3. Gin服务端如何序列化ProtoBuf输出
  4. Go客户端如何反序列化ProtoBuf
  5. Gin关于ProtoBuf的源代码分析原理实现
  6. Gin Render机制分析
  7. Gin如何优雅的面向接口编程

ProtoBuf数据结构

ProtoBuf的数据结构都是通过.proto文件进行定义的,然后再通过ProtoBuf工具生成相应平台语言的类库,这样就可以被我们使用了。

1 2 3 4 5 6 7 8 9 10 11

// 这是protobuf的版本 syntax = "proto3"; //定义包名 package module; // 定义数据结构,message 类似golang中的struct message User { string name = 1; // 定义一个string类型的字段name, 序号为1 int32 age = 2; // 定义一个int32类型的字段age, 序号为2 }

这就是一个比较简单的ProtoBuf数据结构定义了,和我们在Golang里定义Struct差不多。

生成Golang代码

有了ProtoBuf结构数据,我们就可以生成对应的Golang代码了。

首先呢,你要安装protoc编译器,通过这个https://github.com/protocolbuffers/protobuf/releases地址下载,选择适合自己操作系统的版本。下载后要把二进制protoc放在自己的$PATH/bin目录中,确保可以在终端执行。

其次呢,因为ProtoBuf本身不支持GO语言,所以我们还得安装一个生成Golang代码的插件。安装方式也非常简单,通过如下代码即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -u github.com/golang/protobuf/protoc-gen-go

现在我们在终端下cd到我们存放user.proto文件的目录,执行如下代码即可生成对应的Golang代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protoc --go_out=. user.proto

--go_out=.表示输出Golang代码文件到当前目录下,生成的文件名是user.pb.go,规则就是filename.pb.go

生成的代码大家可以看一下,对于我们这么一个简单的User结构,生成的代码量还是很大的,这里截取一些,剩下的大家自己生成后看一下。

1 2 3 4 5 6 7 8

// 定义数据结构,message 类似golang中的struct type User struct { Name string protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty" Age int32 protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty" XXX_NoUnkeyedLiteral struct{} json:"-" XXX_unrecognized []byte json:"-" XXX_sizecache int32 json:"-" }

对应的关键核心User对象。

在Gin中使用ProtoBuf

有了ProtoBuf对应的Golang代码,我们就可以在Gin使用了。

1 2 3 4 5 6 7 8 9 10 11 12

func main() { r := gin.Default() r.GET("/protobuf", func(c *gin.Context) { data := &module.User{ Name: "张三", Age: 20, } c.ProtoBuf(http.StatusOK, data) }) r.Run(":8080") }

在Gin中,我们直接使用生成的module.User即可,把它作为参数传给c.ProtoBuf方法,这样Gin就帮我们自动序列化(其实内部实现还是golang protobuf库),然后我们就可以通过http://localhost:8080/protobuf获取的这个序列化数据了。这个就是 Protocol Buffer API

客户端反序列化ProtoBuf数据

反序列化也很简单,我们先启动上面的服务端 Protocol Buffer API 服务

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

func main() { resp, err := http.Get("http://localhost:8080/protobuf") if err != nil { fmt.Println(err) } else { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) } else { user := &module.User{} proto.UnmarshalMerge(body, user) fmt.Println(*user) } } }

以上就是反序列化,得到User对象的例子。我们运行这段代码,可以看到{张三 20 {} [] 0},拿到了我们想要的信息。这里的关键点,就是通过proto.UnmarshalMerge(body, user)反序列化。

Gin ProtoBuf 源代码分析原理实现

那么Gin是如何实现ProtoBuf序列化的呢?我们从Gin的源代码分析上来看Gin比较优雅的实现,以及Gin的面向接口的编程。剩下的精彩内容请点击:

Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现

精彩文章推荐

Golang Gin 实战(十一)| HTML模板渲染

Golang Gin 实战(十)| XML渲染

Golang Gin 实战(九)| JSONP跨域和劫持

Golang Gin 实战(八)| JSON渲染输出

Golang Gin 实战(七)| 分组路由源代码分析

Golang Gin 实战(六)| 获取Form表单参数和原理分析

Golang Gin 实战(五)| 接收数组和map

Golang Gin 实战(四)| URL查询参数的获取和原理分析

Golang Gin 实战(三)| 路由参数

Golang Gin 实战(二)| 简便的Restful API 实现

Golang Gin 实战(一)| 快速安装入门

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年6月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go 安装protobuf
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
仙士可
2022/01/18
2.3K0
go 安装protobuf
Go 开发者必备:Protocol Buffers 入门指南
在现代软件开发中,系统之间的高效通信至关重要,尤其是在微服务架构和分布式系统中。为了高效地传输数据并保证跨语言的兼容性,Protocol Buffers(简称 Protobuf) 应运而生。Protobuf 是 Google 开发的一种轻量、高效的序列化数据格式。它被广泛应用于微服务、RPC 框架以及大数据处理等领域。
陈明勇
2025/01/22
3.3K8
Go 开发者必备:Protocol Buffers 入门指南
golang源码分析:gogoproto
针对golang 使用proto,有两个功能增强可选包goprotobuf(go官方出品)和gogoprotobuf地址如下
golangLeetcode
2022/12/17
1.2K0
gRPC 使用 protobuf 构建微服务
以前使用 Laravel 做 web 项目时,是根据 MVC 去划分目录结构的,即 Controller 层处理业务逻辑,Model 层处理数据库的 CURD,View 层处理数据渲染与页面交互。以及 MVP、MVVM 都是将整个项目的代码是集中在一个代码库中,进行业务处理。这种单一聚合代码的方式在前期实现业务的速度很快,但在后期会暴露很多问题:
aoho求索
2019/05/17
2.2K0
gRPC 使用 protobuf 构建微服务
Go是如何实现protobuf的编解码的(1): 原理
各位朋友咱们又见面了,我是大彬,今天聊一聊Go是如何实现protobuf编解码的。
大彬
2019/09/09
1.2K0
Go是如何实现protobuf的编解码的(1): 原理
【附近的人】序列化之白送篇---msgpack大战protobuf
本文没有什么亮点不高端不涉及高性能高并发而且网上一搜一大把发誓文章没有蹭mp和pb热点最后的末尾有会挂一个微信的广告
老李秀
2019/11/12
5.8K0
Golang 序列化之 ProtoBuf
ProtoBuf: 是一套完整的 IDL(接口描述语言),出自Google,基于 C++ 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程语言(Golang、Python、Java 等)的接口代码,本篇只讲述 Golang 的基础操作。据说 ProtoBuf 所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级,这也是选择 ProtoBuf 作为序列化方案的一个重要因素之一。 安装 1.安装 protoc :Protoc下载地址(https://
李海彬
2018/03/19
1.5K0
Golang 序列化之 ProtoBuf
Protobuf - 更小、更快、更简单的交互式数据语言
Protocol buffers 是 Google 的一种语言中立、平台中立,可扩展,用于序列化结构化数据的交互式数据语言。相比 JSON、XML,它更小、更快、更简单。
frank.
2020/11/06
1.3K0
Go微服务(二)——Protobuf详细入门
Protobuf是Protocol Buffers的简称,它是Google公司开发的⼀种数据描述语⾔,并于2008年对外开 源。Protobuf刚开源时的定位类似于XML、JSON等数据描述语⾔,通过附带⼯具⽣成代码并实现将结 构化数据序列化的功能。但是我们更关注的是Protobuf作为接⼝规范的描述语⾔,可以作为设计安全的 跨语⾔PRC接⼝的基础⼯具。
传说之下的花儿
2023/04/16
4.1K0
Go微服务(二)——Protobuf详细入门
go简单使用grpc
grpc github:https://github.com/grpc/grpc-go (opens new window)
编程黑洞
2023/03/06
4990
理解Golang组件protobuf
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
平也
2020/04/03
7570
Go每日一库之94:protobuf
protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的,占用空间小,但也带来了可读性差的缺点。protobuf 在通信协议和数据存储等领域应用广泛。例如著名的分布式缓存工具 Memcached 的 Go 语言版本groupcache 就使用了 protobuf 作为其 RPC 数据格式。
luckpunk
2023/09/30
8610
ProtoBuf 生成 Go 代码去掉 JSON tag omitempty
我们经常使用 PB(ProtoBuf)作为数据的交换协议,用于数据的序列化与反序列化。对于 PB 生成的 Go strutc,将其序列化为 JSON 时,比如对于数字类型,默认值为零,将不会出现在 JSON 串中。
恋喵大鲤鱼
2022/06/02
6.2K0
ProtoBuf 生成 Go 代码去掉 JSON tag omitempty
Protobuf用过没?
这也是很久之前了,在一直都怀念的读书时代,参与的第一个的项目,其中有一部分网络通信,基于socket编程。网络通讯TCP/IP相当于交通工具,上层应用协议还得自己设计。学过计算机网络这门课的,自然会对所学的知识举一反三。
河边一枝柳
2021/09/02
1.4K0
GRPC接口测试全通攻略
RPC的全称叫做Remote Procedure Call(远程过程调用),意思是将远程(非本地)的一个方法,当作本地的一个方法来调用的一种规范。举例来帮助大家理解:
TestOps
2022/04/08
3.2K0
GRPC接口测试全通攻略
嵌入式linux之go语言开发(七)protobuf的使用
之前写过一篇博文:《如果终端采用protobuf与采集前置通信,能带来哪些变革?https://blog.csdn.net/yyz_1987/article/details/81147454》,介绍了使用protobuf作为序列化通信格式的诸多好处。
杨永贞
2020/08/04
1.3K0
Go Protobuf(比xml小3-10倍, 快20-100倍)
protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏根据旧数据结构编译而成并且已部署的程序。
iginkgo18
2021/04/13
2.2K0
Golang 语言怎么使用 go-micro 和 gin 开发微服务?
Go Micro 是一个分布式系统开发框架。Go Micro 提供了分布式系统开发的核心需求,包括 RPC 和事件驱动的通信。Gin 是一个用 Golang 编写的 web 框架。本文首先介绍怎么使用 go-micro 和 go-grpc 构建微服务,然后再介绍怎么集成 gin 和 go-micro。我们使用的 go-micro 版本是 v1.18.0,golang 版本是 v1.13,gin 版本是 v1.7.2。
frank.
2021/08/13
3.2K0
Golang 语言怎么使用 go-micro 和 gin 开发微服务?
如何使用Protobuf进行数据交换【Programming(Go)】
在用不同语言编写的应用程序之间以及在不同平台上运行的应用程序之间交换数据时,Protobuf 编码提高了效率。
Potato
2019/11/09
1.6K0
如何使用Protobuf进行数据交换【Programming(Go)】
Go 使用 protobuf
安装 protoc ,protoc 是用来执行根据 proto 文件生成 代码的工具。
晓晨
2022/05/07
1.5K0
Go 使用 protobuf
相关推荐
go 安装protobuf
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档