Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >签约掘金:一文带你玩转ProtoBuf 【文末抽奖】

签约掘金:一文带你玩转ProtoBuf 【文末抽奖】

作者头像
王中阳Go
发布于 2022-10-26 07:12:35
发布于 2022-10-26 07:12:35
90200
代码可运行
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏
运行总次数:0
代码可运行

前言

在网络通信和通用数据交换等应用场景中经常使用的技术是 JSONXML,在微服务架构中通常使用另外一个数据交换的协议的工具ProtoBuf。

ProtoBuf也是我们做微服务开发,进行Go进阶实战中,必知必会的知道点。

今天就开始第一章内容:《一文带你玩转ProtoBuf》

5分钟入门

1.1 简介

你可能不知道ProtoBuf,但一定知道json或者xml,从一定意义上来说他们的作用是一样的。

ProtoBuf全称:protocol buffers,直译过来是:“协议缓冲区”,是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据

和json\xml最大的区别是:json\xml都是基于文本格式,ProtoBuf是二进制格式。

ProtoBuf相比于json\XML,更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

我们只需要定义一次数据结构,就可以使用ProtoBuf生成源代码,轻松搞定在各种数据流和各种语言中写入、读取结构化数据。

1.2 安装

建议大家使用主流版本v3,这是官网下载地址:https://github.com/protocolbuffers/ProtoBuf/releases

注意,不同的电脑系统安装包是不一样的:

  • Windows 64位 点这里下载
  • Windows 32位 点这里下载
  • Mac Intel 64位 点这里下载
  • Mac ARM 64位 点这里下载
  • Linux 64位 点这里下载

小技巧:Mac查看自己的芯片类型点击左上角的苹果图标,再点击关于本机,就可以查看了。

比如,我的处理器芯片是intel的,下载安装包之后是这样的:

bin目录下的protoc是ProtoBuf的工具集,下文会重点介绍它的使用。

注意:我们需要将下载得到的可执行文件protoc所在的 bin 目录加到我们电脑的环境变量中。

Mac安装小技巧

如果你的Mac安装了brew,安装ProtoBuf就更简单了,我们使用brew install ProtoBuf就可以了

1.3 编译go语言的工具包

这个protoc可以将proto文件编译为任何语言的文件,想要编译为go语言的,还需要下载另外一个可执行文件

命令是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go install google.golang.org/ProtoBuf/cmd/protoc-gen-go@latest

1.4 编写proto代码

下面就编写一个非常简单,但是五脏齐全的proto代码,我们再根据这段代码生成pb.go文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package hello;

option go_package = "./;hello";

message Say{
  int64           id    = 1;
  string          hello = 2;
  repeated string word  = 3;
}

1.5 生成go代码

生成go代码,非常简单,使用下面的命令就可以了。

切换到.proto文件所在目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd proto/demo/

指定proto源文件,自动生成代码。

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

执行上面的命令后,我们在项目中就自动生成了一个.pb.go的文件

入门ProtoBuf就是这么的简单:通过这几步我们就完成了ProtoBuf的下载、安装、编写了一个proto文件,并生成了能用Go语言读写ProtoBuf的源代码。

我们再深入了解一下probuf的用法:

10分钟进阶

下面再带大家深入了解一下ProtoBuf的知识点,避免在开发中踩坑。

小技巧:写proto和写go最大的区别是需要在结尾添加分号的;,在开发过程中给自己提个醒:如果是写proto需要加分号,如果是写go不需要加分号。

以我们上面的proto入门代码举例:

1.1 关键字

  • syntax:是必须写的,而且要定义在第一行;目前proto3是主流,不写默认使用proto2
  • package:定义我们proto文件的包名
  • option go_package:定义生成的pb.go的包名,我们通常在proto文件中定义。如果不在proto文件中定义,也可以在使用protoc生成代码时指定pb.go文件的包名
  • message:非常重要,用于定义消息结构体,不用着急,下文会重点讲解

细心的小伙伴一定注意到了 message 消息体中有一个 “repeated” 关键字,这在我们写Go的时候是没有的。

这是干什么用的呢?下面来详细解答一下:

1.2 数组类型

关于数组类型,和Java、Go、PHP等语言中,定义数据类型不一样。

在ProtoBuf消息中定义数组类型,是通过在字段前面增加repeated关键词实现,标记当前字段是一个数组。

只要使用repeated标记类型定义,就表示数组类型。

我们来举两个例子:

1.整数数组:

下面定义的arrays表示int32类型的数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message Msg {
  repeated int32 arrays = 1;
}

2.字符串数组

下面定义的names表示字符串数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message Msg {
  repeated string names = 1;
}

repeated搞懂了,message又是干嘛用的呢?

1.3 消息

消息(message),在ProtoBuf中指的就是我们要定义的数据结构。类似于Go中定义结构体。

message关键词用法也非常简单:

1. 语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

message 消息名 {
    消息体
}

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";
 
message Request {
  string query = 1;
  int32  page = 2;
  int32  limit = 3;
}

定义了一个Request消息,这个消息有3个字段,query是字符串类型,page和limit是int32类型。

1.4 字段类型

ProtoBuf支持多种数据类型,例如:string、int32、double、float等等,我整理了一份ProtoBuf和go语言的数据类型映射表

.proto Type

Go Type

使用技巧

double

float64

没特殊技巧,记住float对应go的float32,double对应go的float64就可以了

float

float32

没特殊技巧,记住float对应go的float32,double对应go的float64就可以了

int32

int32

使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代

uint32

uint32

使用变长编码

uint64

uint64

使用变长编码

sint32

int32

使用变长编码,这些编码在负值时比int32高效的多

sint64

int64

使用变长编码,有符号的整型值。编码时比通常的int64高效。

fixed32

uint32

总是4个字节,如果数值都比228大的话,这个类型会比uint32高效。

fixed64

uint64

总是8个字节,如果数值都比256大的话,这个类型会比uint64高效。

sfixed32

int32

总是4个字节

sfixed64

int64

总是8个字节

bool

bool

严格对应,玩不出其他花样来

string

string

一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。

bytes

[]byte

可以包含任意顺序的字节数组

1.5 分配标识号

细心的小伙伴可能又有疑问了,上面消息体中的 string query = 1; 这个1是什么呢?

这些数字是“分配表示号”:在消息定义中,每个字段后面都有一个唯一的数字,这个就是标识号。

这些标识号的作用是:用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。

注意:分配标识号在每个消息内唯一,不同的消息体是可以拥有相同的标识号的。

小技巧:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。

1.5.1 保留标识号(Reserved)

小技巧:要为将来有可能添加的、频繁出现的字段预留一些标识号。

我们想保留一些标识号,留给以后用,可以使用下面语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message Test {
  reserved 2, 5, 7 to 10; // 保留2,5,7到10这些标识号
}

如果使用了这些保留的标识号,protocol buffer编译器无法编译通过,将会输出警告信息。

1.6 将消息编译成各种语言版本的类库

编译器命令格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protoc [OPTION] PROTO_FILES

OPTION是命令的选项, PROTO_FILES是我们要编译的proto消息定义文件,支持多个。

常用的OPTION选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  --go_out=OUT_DIR            指定代码生成目录,生成 Go 代码
  --cpp_out=OUT_DIR           指定代码生成目录,生成 C++ 代码
  --csharp_out=OUT_DIR        指定代码生成目录,生成 C# 代码
  --java_out=OUT_DIR          指定代码生成目录,生成 java 代码
  --js_out=OUT_DIR            指定代码生成目录,生成 javascript 代码
  --objc_out=OUT_DIR          指定代码生成目录,生成 Objective C 代码
  --php_out=OUT_DIR           指定代码生成目录,生成 php 代码
  --python_out=OUT_DIR        指定代码生成目录,生成 python 代码
  --ruby_out=OUT_DIR          指定代码生成目录,生成 ruby 代码

因为开篇我们就用Go举了例子,下面再用Java举个例子吧:

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

在当前目录导出java版本的代码,编译hello.proto消息,执行效果如下:

下载再带小伙伴们了解一下ProtoBuf的进阶知识点吧:枚举类型、消息嵌套和Map类型。

1.7 枚举类型

写Java的同学枚举一定用的很溜,但是写Go的同学可能有点懵了,Go是不直接支持枚举的,并没有Enum关键字。

关注我,后续会详解Go枚举相关的知识点,在这篇文章中不做重点介绍。

使用枚举的场景是这样的:

当定义一个消息类型的时候,可能想为一个字段指定“预定义值”中的其中一个值,这时候我们就可以通过枚举实现,比如这种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";//指定版本信息,非注释的第一行

enum SexType //枚举消息类型,使用enum关键词定义,一个性别类型的枚举类型
{
    UNKONW = 0; //proto3版本中,首成员必须为0,成员不应有相同的值
    MALE = 1;  //1男
    FEMALE = 2; //2女  0未知
}

// 定义一个用户消息
message UserInfo
{
    string name = 1; // 姓名字段
    SexType sex = 2; // 性别字段,使用SexType枚举类型
}

运行效果如下:

在实际开发中,我们需要定义很多的proto,我们如何做到消息的复用呢?

答案就是:“消息嵌套”

1.8 消息嵌套

我们在开发Java和PHP时,经常嵌套使用类,也可以使用其他类作为自己的成员属性类型;在开发Go时经常嵌套使用结构体。

在ProtoBuf中同样支持消息嵌套,可以在一个消息中嵌套另外一个消息,字段类型可以是另外一个消息类型。

我们来看下面3个经典示例:

1.8.1 引用其他消息类型的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义Article消息
message Article {
  string url = 1;
  string title = 2;
  repeated string tags = 3; // 字符串数组类型
}

// 定义ListArticle消息
message ListArticle {
  // 引用上面定义的Article消息类型,作为results字段的类型
  repeated Article articles = 1; // repeated关键词标记,说明articles字段是一个数组
}

1.8.2 消息嵌套

类似类嵌套一样,消息也可以嵌套,比如这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message ListArticle {
  // 嵌套消息定义
  message Article {
    string url = 1;
    string title = 2;
    repeated string tags = 3;
  }
  // 引用嵌套的消息定义
  repeated Article articles = 1;
}

1.8.3 import导入其他proto文件定义的消息

我们在实际开发中,通常要定义很多消息,如果都写在一个proto文件,是不方便维护的。

小技巧:将消息定义写在不同的proto文件中,在需要的时候可以通过import导入其他proto文件定义的消息。

例子:

创建文件: article.proto

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package nesting;

option go_package = "./;article";

message Article {
  string          url   = 1;
  string          title = 2;
  repeated string tags  = 3; // 字符串数组类型
}

创建文件: list_article.proto

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";
// 导入Article消息定义
import "article.proto";

package nesting;

option go_package = "./;article";

// 定义ListArticle消息
message ListArticle {
  // 使用导入的Result消息
  repeated Article articles = 1;
}

执行效果如下,我们顺利生成了.pb.go文件:

1.9 map类型

我们在Go语言开发中,最常用的就是切片类型和map类型了。

切片类型在ProtoBuf中对应的就是repeated类型,前面我们已经介绍过了。

再重点介绍一下map类型,ProtoBuf也是支持map类型的:

1.9.1 map语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
map<key_type, value_type> map_field = N;

语法非常简单和通用,但是有几个问题需要我们注意:

  1. key_type可以是任何整数或字符串类型(除浮点类型和字节之外的任何标量类型)。
  2. 注意:枚举不是有效的key_type
  3. value_type 可以是除另一个映射之外的任何类型。
  4. Map 字段不能使用repeated关键字修饰。

1.9.2 map的例子

我们举个典型的例子:学生的学科和分数就适合用map定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package map;

option go_package = "./;score";

message Student{
  int64              id    = 1; //id
  string             name  = 2; //学生姓名
  map<string, int32> score = 3;  //学科 分数的map
}

运行效果如下:

再强调一下

注意:Map 字段是不能使用repeated关键字修饰。

至此我们已经掌握了ProtoBuf的所有知识点,是不是非常简单清晰呢?

下面我们在Go项目中实战应用一下ProtoBuf,从ProtoBuf中读取数据,并且转换为我们常用的结构体

5分钟实战

1. 首先我们定义proto文件

我创建了一个demo目录,创建了名为study_info.proto的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
syntax = "proto3";

package demo;

option go_package = "./;study";

message StudyInfo {
  int64              id       = 1; //id
  string             name     = 2; //学习的科目名称
  int32              duration = 3; //学习的时长 单位秒
  map<string, int32> score    = 4; //学习的分数
}

2. 生成代码

使用命令生成pb.go文件:

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

3.编写go文件

编写go文件,读取ProtoBuf中定义的字段,进行赋值,取值,转成结构体等操作:

proto编码和解码的操作和json是非常像的,都使用“Marshal”和“Unmarshal”关键字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
   "fmt"
   "google.golang.org/ProtoBuf/proto"
   study "juejin/ProtoBuf/proto/demo"
)

func main() {
   // 初始化proto中的消息
   studyInfo := &study.StudyInfo{}

   //常规赋值
   studyInfo.Id = 1
   studyInfo.Name = "学习ProtoBuf"
   studyInfo.Duration = 180

   //在go中声明实例化map赋值给ProtoBuf消息中定义的map
   score := make(map[string]int32)
   score["实战"] = 100
   studyInfo.Score = score

   //用字符串的方式:打印ProtoBuf消息
   fmt.Printf("字符串输出结果:%v\n", studyInfo.String())

   //转成二进制文件
   marshal, err := proto.Marshal(studyInfo)
   if err != nil {
      return
   }
   fmt.Printf("Marshal转成二进制结果:%v\n", marshal)

   //将二进制文件转成结构体
   newStudyInfo := study.StudyInfo{}
   err = proto.Unmarshal(marshal, &newStudyInfo)
   if err != nil {
      return
   }
   fmt.Printf("二进制转成结构体的结果:%v\n", &newStudyInfo)
}

运行结果如下:

本文总结

ProtoBuf作为开发微服务必选的数据交换协议,基于二进制传输,比json/xml更小,速度更快,使用也非常的简单。

通过这篇文章,我们不仅学会了ProtoBuf的入门操作,还使用Go语言基于ProtoBuf编码解码了数据,进行了实战。

进阶部分带大家了解了ProtoBuf如何定义消息、ProtoBuf和Go数据类型的映射、枚举类型如何使用、通过消息嵌套复用代码、使用map类型时需要注意的问题和小技巧。

微服务架构成为企业项目的必然选择已是趋势,。

天下难事,必作于易。想都是问题,做才有答案。站着不动,永远是观众

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级打怪之旅 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Protobuf3语法详解
定义一个消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了: syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 文件的第一行指定了你正在使用proto3语法:
生活创客
2018/06/11
5.7K0
嵌入式linux之go语言开发(七)protobuf的使用
之前写过一篇博文:《如果终端采用protobuf与采集前置通信,能带来哪些变革?https://blog.csdn.net/yyz_1987/article/details/81147454》,介绍了使用protobuf作为序列化通信格式的诸多好处。
杨永贞
2020/08/04
1.1K0
Protobuf语言指南
Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源。Protobuf可以用于结构化数据串行化,或者说序列化。它的设计非常适用于在网络通讯中的数据载体,很适合做数据存储或 RPC 数据交换格式,它序列化出来的数据量少再加上以 K-V 的方式来存储数据,对消息的版本兼容性非常强,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。开发者可以通过Protobuf附带的工具生成代码并实现将结构化数据序列化的功能。
KevinYan
2019/10/13
2.2K0
搞定Protocol Buffers (上)- 使用篇
因为工作中gRPC使用非常频繁,而gRPC的默认序列化编码采用的也是Protocol Buffers。业界也盛传其效率及其高效:
用户3904122
2022/06/29
5K0
搞定Protocol Buffers (上)- 使用篇
【Protobuf协议】003-嵌套类型、更新一个消息类型、Any、Oneof、Map(映射)、包
如果你想在它的父消息类型的外部重用这个消息类型,你需要以Parent.Type的形式使用它,如:
訾博ZiBo
2025/01/06
1170
protocol buffers生成go代码原理
本文描述了protocol buffers使用.proto文件生成pb.go文件的过程
charlieroro
2020/03/24
1.8K0
protobuf编码原理
小编遇到一个json序列化非常消耗CPU性能的问题。情况大概是这样的,接口查询的是某对象的属性,该对象的属性有上千个,采用的是JSON存储的,在用Go反序列化到内存结构体的时候,非常消耗CPU。也就是说采用JSON编解码有大量字段对象的场景,往往会出现性能瓶颈。而与之对应的protobuf在编解码时性能要优于json,下面主要对protobuf编码原理做个分析,弄懂protobuf编码效率很高的原因。
数据小冰
2022/08/15
1.4K0
protobuf编码原理
Protocol Buffers (Proto) 语法详解
Protocol Buffers(简称Proto)是一种由Google开发的接口描述语言,用于数据结构的序列化,是一种跨语言的服务描述语言。它主要用于数据序列化,也支持定义服务接口。Proto文件定义了数据结构和RPC服务,然后可以生成各种语言的代码,以实现数据的序列化和反序列化,以及服务的调用。
GeekLiHua
2024/08/30
6600
Carson带你学序列化:这是一份很有诚意的 Protocol Buffer 语法详解
通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC 数据交换的功能
Carson.Ho
2022/03/25
7990
Carson带你学序列化:这是一份很有诚意的 Protocol Buffer 语法详解
Go微服务(二)——Protobuf详细入门
Protobuf是Protocol Buffers的简称,它是Google公司开发的⼀种数据描述语⾔,并于2008年对外开 源。Protobuf刚开源时的定位类似于XML、JSON等数据描述语⾔,通过附带⼯具⽣成代码并实现将结 构化数据序列化的功能。但是我们更关注的是Protobuf作为接⼝规范的描述语⾔,可以作为设计安全的 跨语⾔PRC接⼝的基础⼯具。
传说之下的花儿
2023/04/16
3.6K0
Go微服务(二)——Protobuf详细入门
Google 序列化神器 Protocol Buffer 学习指南
在现代软件开发中,数据的高效传输和存储是一个关键问题。Google 开发的 Protocol Buffer(简称 Protobuf)作为一种语言中立、平台无关、可扩展的机制,用于高效地序列化结构化数据。它比 XML 或 JSON 更加紧凑和高效,非常适合需要高性能和小体积的场景。
Michel_Rolle
2024/06/17
3.3K0
Protobuffer 官方文档学习
该文件的第一行指定您使用的是proto3语法:如果不这样做,协议缓冲区编译器将假定您正在使用proto2。 这必须是文件的第一个非空,非注释行。
solate
2019/07/19
8.2K0
protobuf 序列化和反序列化
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程,与之相对应的过程称之为反序列化(Unserialization)。序列化和反序列化主要用于解决在跨平台和跨语言的情况下, 模块之间的交互和调用,但其本质是为了解决数据传输问题。
洁洁
2024/03/15
6610
go-protobuf, go-grpc-gateway和代码生成
代码生成是一种常用的生产效率技术。广义上看,编译器通过高级语言生产出低级语言或者机器码,也可以理解为一种代码生成。这种技术在现代的工程实践里往往比较常见:IDE通常自带了一些常见的单元测试生成工具;根据特定的snippet可以生成比较常用的代码片段;在go语言中,由于目前缺乏对范型对支持,为了节约重复代码,通常实现了类似技术也是使用代码生成。
王磊-字节跳动
2019/07/28
3.2K0
Golang 语言 gRPC 使用的接口设计语言 protobuf
在学习 gRPC 之前,我们需要先了解 Protocal Buffers,也就是 protobuf,它是接口设计语言(IDL),它与编程语言无关,可以生成所有主流编程语言的代码,而且,它是二进制格式的数据,比较适合传递大量的数据。
frank.
2021/09/08
1K0
Go语言,Protobuf 极速入门!
Protobuf 是 Protocol Buffers 的简称,是一种与语言、平台无关,可扩展的序列化结构化数据的数据描述语言,Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。
微客鸟窝
2021/11/12
8930
Go语言,Protobuf 极速入门!
Protobuf生成Go代码指南
这个教程中将会描述protocol buffer编译器通过给定的 .proto会编译生成什么Go代码。教程针对的是proto3版本的protobuf。在阅读之前确保你已经阅读过Protobuf语言指南。
KevinYan
2019/10/13
5.7K0
【ProtoBuf】文件编写及序列化
为了快速上手以及完整的使用ProtoBuf,我们将编写一个小项目,并根据PB学习程度对这个项目来逐渐改版,每一个版本对应PB的新知识点。在后续内容中,会使用简单的通讯录作为项目实现。
用户11029129
2025/02/18
1610
【ProtoBuf】文件编写及序列化
Protobuf 扩展指南
另一个真实的例子,来自 google 的 http 扩展,这里插件会获取 名为 google.api.http 的 option,然后转换为 http 结构
王磊-字节跳动
2020/05/12
10.2K0
Protobuf 语法指南
本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样生成.proto文件的数据访问类。
beifengtz
2019/08/26
4.2K0
相关推荐
Protobuf3语法详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验