深入理解Golang中的Protocol Buffers及其应用

初识Protobuf

Protocol Buffers简称protobuf,是一个无关语言,无关平台的用于序列化结构化数据的工具,于2008年被Google开源的一种数据描述语言,也可以叫做接口规范的描述语言,相较于json体积更小,传输更快,常定义在.proto文件中,在特定语言进行编译时进行动态编译,所以即使你客户与服务端使用不同的语言,只要修改proto文件则会在两端同时生效:

深入理解Golang中的Protocol Buffers及其应用

protobuf优势:使用二进制格式进行数据编码,相比于文本格式(如 JSON 或 XML),它能显著减少数据的体积,这使得在网络传输中数据更加紧凑,带宽占用更少,尤其在处理大规模数据时,能够提升性能,当然还有编解码效率和多语言支持等等的优势:

深入理解Golang中的Protocol Buffers及其应用

Protobuf原理介绍

protobuf是一种二进制格式编码,实现序列化的结构化数据信息需要通过message来定义一个类似struct的数据集合,每一条protocol buffer消息都是一个小的逻辑记录,包含了一系列的name-value键值对,文件都是以 .proto 为后缀 ,如下是一个基础的.proto文件示例:

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
 
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
 
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
 
  repeated PhoneNumber phone = 4;
}

每一条消息类型都有一个或多个编号唯一的field,并且每一个field都具有名称和类型,以如下简单的messgae进行举例说明一下每个字段的含义是什么:

// repeated: 字段tag,表示复合类型
// Result: 字段数据类型,可以自定义
// results: 字段的命名
// 1: 字段的编号
message SearchResponse {
    repeated Result results = 1;
}

深入理解Golang中的Protocol Buffers及其应用

Go语言环境搭建

protoc:是一个protobuf编译器用于将protobuf)描述文件.proto 文件转换成各编程语言源代码的工具,这个编译器根据 .proto 文件中定义的数据结构,自动生成序列化和反序列化的代码,便于开发者在不同的编程语言中使用protobuf进行数据交换,如下图所示

深入理解Golang中的Protocol Buffers及其应用

通过protobuf编辑器的作用,我们就可以将.proto 文件构造生成右侧的go语言的package:

深入理解Golang中的Protocol Buffers及其应用

接下来我们开始下载protoc这个编辑器,来到官方网址:地址,这里注意根据自身电脑系统情况下载不同的源码包,这里我就以window系统进行举例,这里我们安装如下最新版本:

深入理解Golang中的Protocol Buffers及其应用

下载之后将压缩包解压到本地非C盘目录下,解压后的文件内包含如下三个文件:

include:头文件或库文件;bin:包含protoc编译器;readme.txt安装教程

了解即可:接下来把解压后⽂件中的bin目录配置到系统环境变量的Path中去:

深入理解Golang中的Protocol Buffers及其应用

然后win+r打开cmd终端输入protoc–version命令出现如下界面,有版本号说明我们安装配置成功:

深入理解Golang中的Protocol Buffers及其应用

主要操作:接下来我们只需要将该解压文件bin目录下的 protoc.exe 文件放置到我们配置go语言的GOBIN目录下即可,如下可以看到我们的默认GOBIN目录:

深入理解Golang中的Protocol Buffers及其应用

接下来还需要安装两个go语言的插件工具:protoc-gen-go和protoc-gen-go-grpc它们用于生成 go语言代码,分别用于处理protobuf消息和实现grpc服务,这里我们只需要cmd执行如下安装命令即可:

// 如果下载失败(网络延迟断开),可以考虑先开启代理,在执行如下两个插件安装
go env -w GOPROXY=https://goproxy.cn,direct
 
// 安装protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
// 安装 grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

网速不好直接开启代理,出现如下界面说明我们安装成功:

深入理解Golang中的Protocol Buffers及其应用

然后我们来到我们的GOBIN目录下可以看到我们的工具都以及安装完成了:

深入理解Golang中的Protocol Buffers及其应用

终端执行如下命令可以看到我们的安装版本:

深入理解Golang中的Protocol Buffers及其应用

Protobuf基本使用

定义protobuf文件:一般我们定义应该protobuf文件采用的写法如下所示,以下是对参数讲解:

1)syntax:表示采用proto3的语法,零值初始化

2)package:指明当前是main包

3)option:protobuf的一些选项参数,这里指定要生成的go语言package路径

4)message:关键字定义一个新的String类型

syntax = "proto3";
 
package helloworld;
option go_package = "./";
 
// 定义请求消息
message HelloRequest {
  string name = 1;
}

然后我们终端执行如下命令,可以看到我们的protobuf被编译成功了:

深入理解Golang中的Protocol Buffers及其应用

编译protobuf文件:根据上图对protobuf文件进行编译我们知道,还需要输入对应指令,这里进行如下解释,比如我们要编译如下文件:

深入理解Golang中的Protocol Buffers及其应用

到此这篇关于深入理解Golang中的Protocol Buffers及其应用的文章就介绍到这了,更多相关Go Protocol内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:ZQZZA,如若转载,请注明出处:https://www.wangzhanshi.com/n/5641.html

(0)
ZQZZA的头像ZQZZA
上一篇 2024年12月17日 19:27:46
下一篇 2024年12月17日 19:27:48

相关推荐

  • Golang文件操作之读取与写入方法全攻略

    前言 在日常开发中,文件的读取和写入是非常常见的操作。本文将详细介绍如何在Go语言中进行文件的读写操作,包括文件的创建、打开、读取、写入、关闭等操作,并讲解常见的错误处理和性能优化…

    Golang 2024年12月17日
  • go语言time.After()的作用

    time.After是一个非常实用的函数,它返回一个用于读取的单向通道(<-chan time.Time),这个通道会在指定的时间间隔之后发送当前时间。这个机制常被用于实现超…

    Golang 2024年12月17日
  • 如何使用go实现创建WebSocket服务器

    使用Go语言创建WebSocket服务器可以利用现有的库来简化开发过程。gorilla/websocket 是一个非常流行且功能强大的库,适用于Go语言的WebSocket应用。下…

    Golang 2024年12月17日
  • 一文带你了解Go语言中的函数

    1. 引言 函数是编程中不可或缺的组成部分,无论是在Go语言还是其他编程语言中,函数都扮演着重要的角色。函数能够将一系列的操作封装在一起,使得代码更加模块化、可重用和易于维护。 在…

    Golang 2024年12月26日
  • 在Gin框架中解决跨域问题的多种方法

    一、引言 在使用Go语言进行Web开发时,Gin框架因其简洁、高效的特点而被广泛使用。然而,在实际开发中,跨域问题(CORS, Cross-Origin Resource Shar…

    2024年12月17日
  • 在Go中动态替换SQL查询中的日期参数的完整步骤

    完整指南:在Go中动态替换SQL查询中的日期参数 在处理数据库查询时,经常需要根据不同的输入条件动态地构造SQL语句。尤其是在涉及日期范围的查询中,能够根据实际需求调整查询的起始和…

    Golang 2024年12月17日
  • Golang日志库logrus的介绍与使用示例代码

    logrus概述  简介 Logrus 是一个流行的 Go 语言日志库,它提供了结构化日志和多种日志级别的功能。Logrus 非常灵活,支持自定义日志格式和输出,被许多 …

    Golang 2024年12月17日
  • Go中strings包的基本使用示例代码

    本篇主要总结的是go中的string包的一些函数的操作讲解 string 在各个语言中,都有对应的处理字符串的包,在go中是使用strings来处理的 前缀和后缀 HasPrefi…

    Golang 2024年12月17日
  • GO语言中ni,零值与空结构体的使用

    go语言的初学者,特别是java开发者新学习go语言,对于一些和java类似但是又有差异的概念很容易混淆,比如说go中的零值,nil 和 空结构体。本文就来详细探讨一下go中这些特…

    Golang 2024年12月17日
  • 浅析golang开发Error的使用详解

    Error是Go语言开发中最基础也是最重要的部分,跟其他语言的try catch的作用基本一致,想想在PHP JAVA开发中,try catch 不会使用,或者使用不灵活,就无法感…

    Golang 2024年12月29日

发表回复

登录后才能评论