⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Go reflect包:运行时反射机制

学习使用reflect包在运行时检查类型、获取字段标签、动态调用方法和修改值。 · 难度:入门 · +15XP

Go reflect包:运行时反射机制

反射(Reflection)是程序在运行时检查自身结构和行为的能力。Go的reflect包提供了强大的反射功能,包括类型检查、值获取、方法调用等。常用于ORM、序列化库和测试框架。

1. 基本概念:Type和Value

反射的核心是两个类型:reflect.Type(表示类型)和reflect.Value(表示值)。通过reflect.TypeOf()reflect.ValueOf()获取。

var x float64 = 3.14
t := reflect.TypeOf(x)   // float64
v := reflect.ValueOf(x)  // 3.14

fmt.Println(t.Name()) // float64 fmt.Println(v.Kind()) // float64 (Kind是底层类型) fmt.Println(v.Float()) // 3.14

2. 获取结构体字段和标签

反射常用于解析结构体标签(struct tags),如JSON标签。

type User struct {
    Name string json:"name" validate:"required"
    Age  int    json:"age"
}

u := User{"Alice", 30} t := reflect.TypeOf(u) for i := 0; i < t.NumField(); i++ { field := t.Field(i) fmt.Printf("Field: %s, JSON tag: %s ", field.Name, field.Tag.Get("json")) }

3. 修改值(通过指针)

要修改反射获取的值,必须传递指针,并使用Elem()获取可设置的值。

var y float64 = 2.71
v = reflect.ValueOf(&y).Elem() // 获取指针指向的值
if v.CanSet() {
    v.SetFloat(3.14)
}
fmt.Println(y) // 3.14
方法说明
Kind()返回底层类型(如Int、String、Struct)
NumField()结构体字段数量
Field(i int)获取第i个字段
MethodByName(name)按名获取方法

4. 练习提示

编写一个函数PrintFields,接受任意结构体,使用反射打印每个字段的名称、类型和值。注意处理嵌套结构体。

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 142 篇
0 完成
🔥 0