数据类型映射

Protobuf数据类型描述打包C++语言映射GO语言映射
bool布尔类型1字节boolbool
double64位浮点数Ndoublefloat64
float32为浮点数Nfloatfloat32
int3232位整数Nintint32
uin32无符号32位整数Nunsignedintuint32
int6464位整数N__int64int64
uint6464为无符号整Nunsigned__int64uint64
sint3232位整数,处理负数效率更高Nint32int32
sing6464位整数处理负数效率更高N__int64int64
fixed3232位无符号整数4unsignedint32uint32
fixed6464位无符号整数8unsigned__int64uint64
sfixed3232位整数、能以更高的效率处理负数4unsignedint32int32
sfixed6464为整数8unsigned__int64int64
string只能处理ASCII字符Nstd::stringstring
bytes用于处理多字节的语言字符、如中文Nstd::string[]byte
enum可以包含一个用户自定义的枚举类型uint32N(uint32)enum结构体:struct/数据:int32
message可以包含一个用户自定义的消息类型Nobjectofclassstruct

Tips

  • N 表示打包的字节并不是固定。而是根据数据的大小或者长度。
  • 例如int32,如果数值比较小,在0~127时,使用一个字节打包。
  • 关于枚举的打包方式和uint32相同,GO情况下不同。
  • 关于message,类似于C语言中的结构包含另外一个结构作为数据成员一样。
  • 关于 fixed32 和int32的区别。fixed32的打包效率比int32的效率高,但是使用的空间一般比int32多。因此一个属于时间效率高,一个属于空间效率高。根据项目的实际情况,一般选择fixed32,如果遇到对传输数据量要求比较苛刻的环境,可以选择int32。

映射到 JSON

对于前端数据交换还是用JSON会更加多一些,因此映射JSON后的结构体。

Proto3JSONJSON example
messageobject{"fooBar": v, "g": null, …}
enumstring"FOO\_BAR"
mapobject{"k": v, …}
repeated Varray[v, ...]
booltrue,falsetrue, false
stringstring"hello"
bytesbase64 string"YWJjMTIzIT8kKiYoKSctPUB+"
int32, fixed32, uint32number1, -10, 0
int64, fixed64, uint64string"1", "-10"
float, doublenumber1.1, -10.0, 0, "NaN", "Infinity"
Anyobject{"@type": "url", "f": v, … }
Timestampstring"1972-01-01T10:00:20.021Z"
Durationstring"1.000340012s", "1s"
Structobject{...}
Wrapper typesvarious types2, "2", "foo", true, "true", null, 0, …
FieldMaskstring"f.fooBar,h"
ListValuearray[foo, bar, …]
ValueValue
NullValuenull
Emptyobject{}

最后修改:2022-04-20
如果觉得我的文章有意思,欢迎赞赏,我会努力创造更好的文章!