Go语言反射机制
一、对值的反射
package main
import (
"fmt"
"reflect"
)
func reflectVal(i interface{}) {
te := reflect.TypeOf(i)
fmt.Println(te) //获得数据类型,注意:这里获得的变量的类型是reflect变量类型,需要和interface转换,需要使用类型断言
val := reflect.ValueOf(i)
fmt.Println(val) //获取参数的值
val1 := val.Interface() //转换为Interface函数
fmt.Printf("%T\n", val1)
n := 3 + val1.(int) // 使用类型断言让计算成立
fmt.Println("转换后获得的值为:", n)
}
func main() {
var i int = 10
reflectVal(i)
}
二、对结构体的反射
package main
import (
"fmt"
"reflect"
)
type Student struct {
Id int
Name string
Age int
}
func reflectStruct(b interface{}) {
te := reflect.TypeOf(b) //获取类型
fmt.Println(te)
val := reflect.ValueOf(b) //获取结构体的值
fmt.Println(val)
val1 := val.Interface() //转化为接口类型
stu := val1.(Student) //通过类型断言将空接口转换为Student结构体
fmt.Println(stu.Name) //输出学生名字
}
func main() {
stu := Student{
Id: 1,
Name: "Yang",
Age: 12,
}
reflectStruct(stu)
}
注意type和kind的区别,type更加细致,精确到那个函数,kind只是类别
三、调用方法和字段
package main
import (
"fmt"
"reflect"
)
type Student struct {
Id int
Name string
Age int
}
func (stu Student) Rm() {
fmt.Println("Get This Method")
}
func (stu Student) Rm1() {
fmt.Println("Get This Method1")
}
func reflectStruct(b interface{}) {
te := reflect.TypeOf(b)
fmt.Println(te)
val := reflect.ValueOf(b)
kd := val.Kind() //获取结构体的类别
if kd != reflect.Struct {
return
} //判断是否为结构体
n := val.NumField() //获取结构体字段
fmt.Println("结构体的字段有", n)
for i := 0; i < n; i++ {
fmt.Printf("输出第%d个字段值为%v\n", i, val.Field(i))
} //遍历输出所有的字段
numMethod := val.NumMethod() //获取结构体的所有方法
fmt.Println(numMethod)
val.Method(0).Call(nil) //调用第一个的方法
}
func main() {
stu := Student{
Id: 1,
Name: "Yang",
Age: 12,
}
reflectStruct(stu)
}
四、通过字符串调用方法
1、RPC注册
后续讲解
2、反射
package main
import (
"fmt"
"reflect"
)
type Student struct {
Id int
Name string
Age int
}
func (this *Student) Talk() {
fmt.Println("I'm a Student")
}
func main() {
stu := &Student{
Id: 1,
Name: "yang",
Age: 12,
}
val := reflect.ValueOf(stu)
method := val.MethodByName("Talk") //判断是否有这个方法
method.Call(nil)
}
如果看完对自己有所帮助,请点赞支持