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

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

3.1 KiB

反射与内存对齐(扩展)

反射获取值与类型

// 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

// 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{}
}

动态修改对象

// 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{}
}