引言

反射在 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。

您可能感兴趣的文章: