go20/day04/reflect/main.go
yumaojun03 11aaa2d03a ```
docs(day04): 更新README目录结构并添加内存管理图表

- 在README.md中更新目录链接,将原有的列表格式改为链接格式
- 添加Go语言结构体、指针和反射的相关文档链接
- 修改drawio图表文件,调整坐标参数和页面布局
- 增加堆栈内存管理的可视化图表,包含函数调用和变量分配示例
- 添加代码示例展示Go语言中的变量提升机制
```
2026-02-01 17:37:44 +08:00

65 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"reflect"
)
func main() {
// bike 对象
bike := TranficTool{Name: "自行车", Speed: 20, Color: "黑色"}
JsonEncode(&bike)
fmt.Println(bike)
}
// 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{}
}
type TranficTool struct {
// `` 表示字符串 都是 Struct Tag, 结构体标签lib 反射使用
Name string `json:"name"`
Speed int `json:"speed"`
Color string `json:"color"`
}