在我们程序中,有些变量的类型是在编译的时候就知道的,然而有些类型是运行时候才可以知道,比如C++里面的纯虚基类,golang中的interface等。
各种语言都会存在反射机制,反射机制是用来获取运行时的变量的类型以及值。
下面以golang为demo给大家解释下:
type StuDemo struct {
Data int
Name string
}
func PrintData(data interface{}) {
if reflect.TypeOf(data).Kind() == reflect.Struct {
v := reflect.ValueOf(data)
for index := 0; index < v.NumField(); index++ {
fmt.Println("item key value : ", v.Field(index), " kind : ", v.Field(index).Kind())
}
}
}
func main() {
stuData := StuDemo{Name: "aaa", Data: 1}
fmt.Println("StuDemo type : ", reflect.TypeOf(stuData))
fmt.Println("StuDemo value : ", reflect.ValueOf(stuData))
fmt.Println("StuDemo kind : ", reflect.TypeOf(stuData).Kind())
mapData := make(map[string]int)
fmt.Println("mapData type : ", reflect.TypeOf(mapData))
fmt.Println("mapData value : ", reflect.ValueOf(mapData))
fmt.Println("mapData kind : ", reflect.TypeOf(mapData).Kind())
}
输出结果:
StuDemo type : main.StuDemo
StuDemo value : {1 aaa}
StuDemo kind : struct
item key value : 1 kind : int
item key value : aaa kind : string
mapData type : map[string]int
mapData value : map[]
mapData kind : map
从中可以看出,golang中是通过reflect包来实现的。
reflect.typeof 得到的结果是这个变量的类型,比如main.StuDemo、map[string]int等。
reflect.valueof 这个没什么说的,就是变量的值。
kind 指的是type对应的类型,比如int 、struct、map等。
NumField 是用在struct类型上面,可以获取到有多少个fields,field(index)可以获取到每个field的变量值。