虽然,这个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会报错。