110 lines
3.1 KiB
Markdown
110 lines
3.1 KiB
Markdown
|
|
# 反射与内存对齐(扩展)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
## 反射获取值与类型
|
||
|
|
|
||
|
|
```go
|
||
|
|
// obj -> []byte 类型是 any
|
||
|
|
func JsonEncode(obj any) []byte {
|
||
|
|
// 反射获取类型信息
|
||
|
|
ot := reflect.TypeOf(obj)
|
||
|
|
fmt.Println("类型名称:", ot.Name())
|
||
|
|
fmt.Println("类型种类:", ot.Kind())
|
||
|
|
// 类型名称: TranficTool
|
||
|
|
// 类型种类: struct
|
||
|
|
|
||
|
|
// 反射获取值信息
|
||
|
|
ov := reflect.ValueOf(obj)
|
||
|
|
fmt.Println("值:", ov)
|
||
|
|
// 值: {自行车 20 黑色}
|
||
|
|
|
||
|
|
return []byte{}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 反射获取stuct的字段和 Struct Tag
|
||
|
|
|
||
|
|
```go
|
||
|
|
// obj -> []byte 类型是 any
|
||
|
|
func JsonEncode(obj any) []byte {
|
||
|
|
// 反射获取类型信息
|
||
|
|
ot := reflect.TypeOf(obj)
|
||
|
|
fmt.Println("类型名称:", ot.Name())
|
||
|
|
fmt.Println("类型种类:", ot.Kind())
|
||
|
|
// 类型名称: TranficTool
|
||
|
|
// 类型种类: struct
|
||
|
|
|
||
|
|
// 反射获取值信息
|
||
|
|
ov := reflect.ValueOf(obj)
|
||
|
|
fmt.Println("值:", ov)
|
||
|
|
// 反射获取结构体字段信息(TranficTool)
|
||
|
|
for i := 0; i < ot.NumField(); i++ {
|
||
|
|
field := ot.Field(i)
|
||
|
|
fieldValue := ov.Field(i)
|
||
|
|
fmt.Printf(" 字段 %d: 名称=%s, 类型=%s, Tag=%s, JsonTag=%s, Value=%v\n",
|
||
|
|
i, field.Name, field.Type.Name(), field.Tag, field.Tag.Get("json"), fieldValue.Interface())
|
||
|
|
}
|
||
|
|
|
||
|
|
// 类型名称: TranficTool
|
||
|
|
// 类型种类: struct
|
||
|
|
// 值: {自行车 20 黑色}
|
||
|
|
// 字段 0: 名称=Name, 类型=string, Tag=json:"name", JsonTag=name, Value=自行车
|
||
|
|
// 字段 1: 名称=Speed, 类型=int, Tag=json:"speed", JsonTag=speed, Value=20
|
||
|
|
// 字段 2: 名称=Color, 类型=string, Tag=json:"color", JsonTag=color, Value=黑色
|
||
|
|
//
|
||
|
|
// 很容易就可以构建出 Json 数据
|
||
|
|
// {"name":"自行车","speed":20,"color":"黑色"}
|
||
|
|
|
||
|
|
return []byte{}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
|
||
|
|
## 动态修改对象
|
||
|
|
|
||
|
|
```go
|
||
|
|
// obj -> []byte 类型是 any
|
||
|
|
func JsonEncode(obj any) []byte {
|
||
|
|
// 反射获取类型信息
|
||
|
|
ot := reflect.TypeOf(obj)
|
||
|
|
|
||
|
|
if ot.Kind() != reflect.Pointer && ot.Kind() != reflect.Struct {
|
||
|
|
panic("必须是结构体指针类型")
|
||
|
|
}
|
||
|
|
|
||
|
|
ot = ot.Elem() // 获取指针指向的类型
|
||
|
|
|
||
|
|
fmt.Println("类型名称:", ot.Name())
|
||
|
|
fmt.Println("类型种类:", ot.Kind())
|
||
|
|
// 类型名称: TranficTool
|
||
|
|
// 类型种类: struct
|
||
|
|
|
||
|
|
// 反射获取值信息
|
||
|
|
ov := reflect.ValueOf(obj).Elem()
|
||
|
|
fmt.Println("值:", ov)
|
||
|
|
// 反射获取结构体字段信息(TranficTool)
|
||
|
|
for i := 0; i < ot.NumField(); i++ {
|
||
|
|
field := ot.Field(i)
|
||
|
|
fieldValue := ov.Field(i)
|
||
|
|
if field.Name == "Name" {
|
||
|
|
fmt.Println("发现 Name 字段,准备进行特殊处理...")
|
||
|
|
fieldValue.SetString(fieldValue.String() + "_changed")
|
||
|
|
}
|
||
|
|
fmt.Printf(" 字段 %d: 名称=%s, 类型=%s, Tag=%s, JsonTag=%s, Value=%v\n",
|
||
|
|
i, field.Name, field.Type.Name(), field.Tag, field.Tag.Get("json"), fieldValue.Interface())
|
||
|
|
}
|
||
|
|
|
||
|
|
// 类型名称: TranficTool
|
||
|
|
// 类型种类: struct
|
||
|
|
// 值: {自行车 20 黑色}
|
||
|
|
// 字段 0: 名称=Name, 类型=string, Tag=json:"name", JsonTag=name, Value=自行车
|
||
|
|
// 字段 1: 名称=Speed, 类型=int, Tag=json:"speed", JsonTag=speed, Value=20
|
||
|
|
// 字段 2: 名称=Color, 类型=string, Tag=json:"color", JsonTag=color, Value=黑色
|
||
|
|
//
|
||
|
|
// 很容易就可以构建出 Json 数据
|
||
|
|
// {"name":"自行车","speed":20,"color":"黑色"}
|
||
|
|
|
||
|
|
return []byte{}
|
||
|
|
}
|
||
|
|
```
|