Go 反射是一个强大的工具,可以让我们在运行时检查类型和变量,并动态地修改它们的值。下面是一些 Go 反射的使用示例:
- 获取变量的类型和值
x := 42
v := reflect.ValueOf(x)
t := reflect.TypeOf(x)
fmt.Println("Value:", v)
fmt.Println("Type:", t)
输出:
Value: 42
Type: int
- 动态修改变量的值
x := 42
v := reflect.ValueOf(&x).Elem()
v.SetInt(100)
fmt.Println(x)
输出:
100
- 获取结构体的字段名和值
type Person struct {
Name string
Age int
}
p := Person{Name: "Tom", Age: 30}
v := reflect.ValueOf(p)
t := reflect.TypeOf(p)
for i := 0; i < t.NumField(); i++ {
fieldName := t.Field(i).Name
fieldValue := v.Field(i).Interface()
fmt.Printf("%s: %v\n", fieldName, fieldValue)
}
输出:
Name: Tom
Age: 30
- 动态调用函数
func HelloWorld(name string) {
fmt.Printf("Hello, %s!\n", name)
}
f := reflect.ValueOf(HelloWorld)
args := []reflect.Value{reflect.ValueOf("World")}
f.Call(args)
输出:
Hello, World!
- 判断变量的类型
x := 42
v := reflect.ValueOf(x)
t := v.Type()
if t.Kind() == reflect.Int {
fmt.Println("x is an integer")
}
输出:
x is an integer
总之,Go 反射是一个非常强大的工具,可以帮助我们处理各种运行时的场景,但使用反射需要小心谨慎,因为它会带来性能损失和代码的可读性下降。