reflect.Type 与 reflect.Value
TypeOf、ValueOf、Kind 与 Elem
reflect.Type 与 reflect.Value 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
reflect 包概览
reflect 包允许 Go 程序在运行时检查类型和值。它是编码库、ORM 和依赖注入框架的基础。
reflect.TypeOf
reflect.TypeOf(x) 返回 x 的值对应的 reflect.Type:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
reflect.ValueOf(x) 返回一个保存 x 的 reflect.Value。您可以使用针对 Kind 的方法读取该值:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind 与 Type.Name
Kind 表示底层的 Go 类别(int、struct、ptr、slice 等)。Name 表示声明的类型名称("MyStruct")。接口的 Kind == Interface,但没有 Name。
结构体字段
通过 Type.NumField() 和 Type.Field(i) 检查结构体字段,后者返回一个 reflect.StructField:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}读取结构体字段值
使用 Value.FieldByName 或 Value.Field(i) 在运行时读取字段值:
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"设置结构体字段值
要设置字段,该值必须是可寻址的(以指针形式传入):
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")指针解引用
如果某个值是指针,请调用 v.Elem() 获取指针指向的值。请先检查 v.Kind() == reflect.Ptr。
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
创建某种类型的新零值,并获取指向它的指针:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)调用方法
通过名称在反射值上调用方法:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())性能
反射比直接代码慢 5 到 10 倍。请在热点循环之外缓存 reflect.Type 和 reflect.Value 查找结果。如果性能至关重要,请使用代码生成。
快速检查
reflect.Type.Kind() 与 reflect.Type.Name() 有什么区别?
回顾:reflect.Type 与 reflect.Value
要点:
- 使用 reflect.TypeOf/ValueOf 在运行时检查类型
- Kind:底层类别;Name:声明的名称
- 使用 Value.FieldByName 和 SetXxx 操作结构体字段
- 传入指针并调用 Elem(),以获得可设置的值
常见问题解答
「reflect.Type 与 reflect.Value」课时是免费的吗?
是的 — 「reflect.Type 与 reflect.Value」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「reflect.Type 与 reflect.Value」这节课中我会学到什么?
TypeOf、ValueOf、Kind 与 Elem 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「reflect.Type 与 reflect.Value」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- reflect.Type 与 reflect.Value
- 检查结构体字段与标签
- 动态函数调用
- 实用反射:序列化器