引言
反射在 Go 语言中是一个强大且高级的概念,它允许我们在运行时对变量进行内省,包括变量的类型、值、方法等。
reflect
import "reflect"
反射的类型(Type)和值(Value)
var x int = 3xint3
reflect.TypeOfreflect.ValueOf
var x int = 3 fmt.Println(reflect.TypeOf(x)) // 输出 "int" fmt.Println(reflect.ValueOf(x)) // 输出 "3"
reflect.Typereflect.Value
操作反射值
reflect.ValueInt()
var x int = 3 v := reflect.ValueOf(x) fmt.Println(v.Int()) // 输出 "3"
Int()Kind()
v := reflect.ValueOf(x) if v.Kind() == reflect.Int { fmt.Println(v.Int()) // 输出 "3" }
通过反射修改值
reflect.ValueOfreflect.ValueOf(&x).Elem()SetInt
var x int = 3 v := reflect.ValueOf(&x).Elem() v.SetInt(4) fmt.Println(x) // 输出 "4"
Elem()
总结
反射是 Go 语言中非常强大的一个特性,它让我们能够在运行时对变量进行内省和修改。但是,反射的使用也需要谨慎,因为反射操作的类型安全是在运行时进行检查的,而不是在编译时。这意味着如果你在编写反射代码时犯了错误,可能会在运行时产生 panic。