数据类型映射
Protobuf数据类型 | 描述 | 打包 | C++语言映射 | GO语言映射 |
---|---|---|---|---|
bool | 布尔类型 | 1字节 | bool | bool |
double | 64位浮点数 | N | double | float64 |
float | 32为浮点数 | N | float | float32 |
int32 | 32位整数 | N | int | int32 |
uin32 | 无符号32位整数 | N | unsignedint | uint32 |
int64 | 64位整数 | N | __int64 | int64 |
uint64 | 64为无符号整 | N | unsigned__int64 | uint64 |
sint32 | 32位整数,处理负数效率更高 | N | int32 | int32 |
sing64 | 64位整数处理负数效率更高 | N | __int64 | int64 |
fixed32 | 32位无符号整数 | 4 | unsignedint32 | uint32 |
fixed64 | 64位无符号整数 | 8 | unsigned__int64 | uint64 |
sfixed32 | 32位整数、能以更高的效率处理负数 | 4 | unsignedint32 | int32 |
sfixed64 | 64为整数 | 8 | unsigned__int64 | int64 |
string | 只能处理ASCII字符 | N | std::string | string |
bytes | 用于处理多字节的语言字符、如中文 | N | std::string | []byte |
enum | 可以包含一个用户自定义的枚举类型uint32 | N(uint32) | enum | 结构体:struct/数据:int32 |
message | 可以包含一个用户自定义的消息类型 | N | objectofclass | struct |
Tips
- N 表示打包的字节并不是固定。而是根据数据的大小或者长度。
- 例如int32,如果数值比较小,在0~127时,使用一个字节打包。
- 关于枚举的打包方式和uint32相同,GO情况下不同。
- 关于message,类似于C语言中的结构包含另外一个结构作为数据成员一样。
- 关于 fixed32 和int32的区别。fixed32的打包效率比int32的效率高,但是使用的空间一般比int32多。因此一个属于时间效率高,一个属于空间效率高。根据项目的实际情况,一般选择fixed32,如果遇到对传输数据量要求比较苛刻的环境,可以选择int32。
映射到 JSON
对于前端数据交换还是用JSON会更加多一些,因此映射JSON后的结构体。
Proto3 | JSON | JSON example |
---|---|---|
message | object | {"fooBar": v, "g": null, …} |
enum | string | "FOO\_BAR" |
map | object | {"k": v, …} |
repeated V | array | [v, ...] |
bool | true,false | true, false |
string | string | "hello" |
bytes | base64 string | "YWJjMTIzIT8kKiYoKSctPUB+" |
int32, fixed32, uint32 | number | 1, -10, 0 |
int64, fixed64, uint64 | string | "1", "-10" |
float, double | number | 1.1, -10.0, 0, "NaN", "Infinity" |
Any | object | {"@type": "url", "f": v, … } |
Timestamp | string | "1972-01-01T10:00:20.021Z" |
Duration | string | "1.000340012s", "1s" |
Struct | object | {...} |
Wrapper types | various types | 2, "2", "foo", true, "true", null, 0, … |
FieldMask | string | "f.fooBar,h" |
ListValue | array | [foo, bar, …] |
Value | Value | |
NullValue | null | |
Empty | object | {} |