支持类型
Fory Go 支持广泛的 Go 类型序列化。本指南介绍支持的类型以及它们的跨语言映射关系。
基础类型
| Go 类型 | Fory TypeId | 编码方式 | 说明 |
|---|---|---|---|
bool | BOOL (1) | 1 字节 | |
int8 | INT8 (2) | 1 字节,有符号 | |
int16 | INT16 (3) | 2 字节,有符号 | 小端序 |
int32 | INT32 (4) | Varint | 变长编码 |
int64 | INT64 (6) | Varint | 变长编码 |
int | INT32/INT64 | Varint | 依赖平台位宽(32/64 位) |
uint8 / byte | UINT8 (9) | 1 字节,无符号 | |
uint16 | UINT16 (10) | 2 字节,无符号 | 小端序 |
uint32 | UINT32 (11) | Varuint | 变长编码 |
uint64 | UINT64 (13) | Varuint | 变长编码 |
float32 | FLOAT32 (17) | 4 字节 | IEEE 754 |
float64 | FLOAT64 (18) | 8 字节 | IEEE 754 |
string | STRING (19) | UTF-8 长度前缀 |
整数编码
Fory 使用变长整数编码(varint)来提升压缩效果:
- 数值越小,占用字节越少
- 负数使用 ZigZag 编码
- 平台的
int在 32 位系统上映射为int32,在 64 位系统上映射为int64
f := fory.New()
// 支持所有常见整数类型
var i8 int8 = 127
var i16 int16 = 32767
var i32 int32 = 2147483647
var i64 int64 = 9223372036854775807
data, _ := f.Serialize(i64) // 使用 varint 编码
集合类型
Slice
| Go 类型 | Fory TypeId | 说明 |
|---|---|---|
[]bool | BOOL_ARRAY | 优化编码 |
[]int8 | INT8_ARRAY | 优化编码 |
[]int16 | INT16_ARRAY | 优化编码 |
[]int32 | INT32_ARRAY | 优化编码 |
[]int64 | INT64_ARRAY | 优化编码 |
[]float32 | FLOAT32_ARRAY | 优化编码 |
[]float64 | FLOAT64_ARRAY | 优化编码 |
[]string | LIST | 通用列表编码 |
[]T(任意类型) | LIST (20) | 任意可序列化类型 |
[]I(接口元素) | LIST | 任意接口类型 |
f := fory.New()
// 基础类型 slice(优化编码)
ints := []int32{1, 2, 3, 4, 5}
data, _ := f.Serialize(ints)
// 字符串 slice
strs := []string{"a", "b", "c"}
data, _ = f.Serialize(strs)
// 结构体 slice
users := []User{{ID: 1}, {ID: 2}}
data, _ = f.Serialize(users)
// 动态 slice
dynamic := []any{1, "hello", true}
data, _ = f.Serialize(dynamic)
Map
| Go 类型 | Fory TypeId | 说明 |
|---|---|---|
map[string]string | MAP (22) | 优化编码 |
map[string]int64 | MAP | 优化编码 |
map[string]int32 | MAP | 优化编码 |
map[string]int | MAP | 优化编码 |
map[string]float64 | MAP | 优化编码 |
map[string]bool | MAP | 优化编码 |
map[int32]int32 | MAP | 优化编码 |
map[int64]int64 | MAP | 优化编码 |
map[int]int | MAP | 优化编码 |
map[string]any | MAP | 动态值 |
map[any]any | MAP | 动态键和值 |
f := fory.New()
// 字符串键 map
m1 := map[string]string{"key": "value"}
m2 := map[string]int64{"count": 42}
// 整数键 map
m3 := map[int32]int32{1: 100, 2: 200}
// 动态 map
m4 := map[string]any{
"name": "Alice",
"age": int64(30),
}
Set
Fory 提供了泛型 Set[T] 类型,底层使用 map[T]struct{},不会为 value 带来额外内存开销:
// 创建字符串集合
s := fory.NewSet[string]()
s.Add("a", "b", "c")
// 检查成员
if s.Contains("a") {
fmt.Println("found")
}
// 序列化
data, _ := f.Serialize(s)
时间类型
| Go 类型 | Fory TypeId | 说明 |
|---|---|---|
time.Time | TIMESTAMP (34) | 纳秒精度 |
time.Duration | DURATION (33) | 纳秒精度 |
import "time"
f := fory.New()
// 时间戳
t := time.Now()
data, _ := f.Serialize(t)
// Duration
d := 5 * time.Second
data, _ = f.Serialize(d)