# 反射与内存对齐(扩展) ## 反射获取值与类型 ```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{} } ```