专栏首页飞雪无情的博客Golang Gin 实战(十二)| ProtoBuf 使用和源码分析原理实现

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

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代码的插件。安装方式也非常简单,通过如下代码即可:

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

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

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 实战(一)| 快速安装入门

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    在 上一篇 Golang Gin 实战(四)| URL查询参数的获取和原理分析 文章中,因为文章篇幅问题,QueryArray和QueryMap没有介绍,这篇文...

    飞雪无情
  • Golang Gin 实战(一)| 快速安装入门

    Gin 是一个非常优秀的Golang Web Framework,它不光API友好,性能也非常高,并且设计简洁,便于入门。所以它(Gin)非常受欢迎,在Gith...

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

    在 上一篇 Golang Gin 实战(三)| 路由参数 文章中,主要介绍了路由通配符、路由参数,让我们有了一种可以从URL路径中获取参数的方式,同时又不是重复...

    飞雪无情
  • Golang Gin 实战(十)| XML渲染

    虽然当前基于XML的API应用不多,但是Gin也提供了便捷的XML生成,可以把这些用于需要XML的地方,比如网站的sitemap,rss订阅的atom等。

    飞雪无情
  • Golang Gin 实战(十一)| HTML模板渲染

    终于又到一个重头戏了。在整个服务端开发中,一个是API,一个就是网页,当前的API大部分都是通过JSON提供了,而网页就是通过HTML提供了。所以对于这么大的需...

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

    除了通过URL查询参数提交数据到服务器外,常用的还有通过Form表单的方式。Form表单相比URL查询参数,用户体验好,可以承载更多的数据,尤其是文件上传,所以...

    飞雪无情
  • Golang 中的微服务-第一部分

    介绍 Golang 中的微服务系列总计十部分,预计每周更新。本系列的解决方案采用了 protobuf 和 gRPC 作为底层传输协议。为什么采用这两个技术呢?我...

    企鹅号小编
  • Go框架解析-Gin

    今天是我golang框架阅读系列第三篇文章,今天我们主要看看gin的框架执行流程。关于golang框架生命周期源码阅读下面是我的计划:

    用户1093396
  • Go学习_30_Golang代码性能分析工具

    Golang内置了一些性能分析工具,可以将性能分析的结果文件输出,我们可以使用图形化的工具查看分析结果,在使用这些工具之前,我们需要安装一些工具,以便于查看分析...

    码农帮派

扫码关注云+社区

领取腾讯云代金券