虽然,这个intf的类型是main.student,但是想要取他的名字字段还是取不出来的。
因为反射的本质是在运行的时候可以确定intf的类型,但是在编译阶段获取不到他的类型。
想要获取他的字段,必须要通过断言来实现。
断言还可以用ok来接受是否成功
intf2, ok := intf.(Student)
if ok {
name := intf2.Name
fmt.Println(name)
}
利用kind来获取const常量
func reflectTest02(b interface{}) {
//1.先获取到reflect.Type
rTyp := reflect.TypeOf(b)
//fmt.Println("1.rType=\n", rTyp)
//2.获取到reflect.Value
rVal := reflect.ValueOf(b)
fmt.Printf("kind = %v kind = %v", rTyp.Kind(), rVal.Kind())
}
kind的概念要大于type,比如kind是电器,那么type就是冰箱。
type和king可能是相同的,也可能是不同的。
比如,var num int = 10,num的type是int,kind也是int。
比如,var stu Student,stu的Type是包名.Student,kind是struct。
例如,如果在一个项目中有两个相同的结构体Student,分属于不同的包。
1.pkg1.Student,他的kind是struct。
2.pkg2.Student,他的kind也是struct。
虽然type不同,但是kind是相同的。
如果传入的值本来是int类型的,反射的时候用float会报错。