golang基础之reflect反射
反射是程序在运行时可以检查其自身结构,变量类型等特性的能力。在Golang中,反射是通过reflect包实现的。
以下是一些使用Golang反射的常见方法:
- 使用reflect.TypeOf获取变量的类型
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
fmt.Println("type of a is ", reflect.TypeOf(a))
}
- 使用reflect.ValueOf获取变量的值
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
fmt.Println("value of a is ", reflect.ValueOf(a))
}
- 使用reflect.Value.Kind()和reflect.Type.Kind()获取变量的类型种类
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
fmt.Println("kind of a is ", reflect.ValueOf(a).Kind())
fmt.Println("kind of a is ", reflect.TypeOf(a).Kind())
}
- 使用reflect.Value.Int()获取变量的整数值
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
v := reflect.ValueOf(a)
fmt.Println("int value of a is ", v.Int())
}
- 使用reflect.Value.SetInt()设置变量的整数值
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
v := reflect.ValueOf(a)
v.SetInt(100)
fmt.Println("new int value of a is ", a)
}
注意:上述代码中,v.SetInt(100)会引发panic,因为v是reflect.Value类型,它是不可以更改原始变量的。为了可以更改,需要将v转换为可设置的reflect.Value,可以通过调用v.Elem()或v.Addr()来达到目的。
- 使用reflect.Value.Elem()获取变量的引用值
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
v := reflect.ValueOf(a)
v = v.Elem()
fmt.Println("value of a is ", v)
}
注意:v.Elem()会引发panic,因为v不是指针类型。只有指针类型才能通过Elem()获取引用的值。
- 使用reflect.Value.CanSet()检查变量是否可以被设置
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
v := reflect.ValueOf(a)
fmt.Println("can set a?", v.CanSet())
}
注意:v.CanSet()会返回false,因为a是不可以更改的。
- 使用reflect.Value.Set()设置变量的值
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 10
v := reflect.ValueOf(a)
v.Set(reflect.ValueOf(100))
fmt.Println("new int value of a is ", a)
}
注意:v.Set(reflect.ValueOf(100))会引发panic,因为v不是可以
评论已关闭