应用场景
1.判断函数变量是否否和标准
2.验证接口值是否合理如(是否为空,传入的字段是否合规)
3.获取变量的类型进行断言等操作
在Go语言的反射机制中,任何接口值都由是一个具体类型和具体类型的值两部分组成的(我们在上一篇接口的博客中有介绍相关概念)。 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。
1.结构体中使用反射
- 获取 2 种类型信息的方法:
reflect.TypeOf() 获取类型信息,返回 Type 类型;
reflect.ValueOf() 获取数据信息,返回 Value 类型。
反射中值的可设置性,可以用 CanSet 方法来判断值是否可以设置。在 Go 中,函数参数的传递都是值拷贝,在反射中要修改值,必须传递指针,并且用 Elem() 方法获取指针的值,然后进行修改。
reflect.ValueOf() 返回的 Value 类型:
- 它有一个 Type() 方法,返回的是 reflect.Value 的 Type
- 它有获取 Value 类型值的方法如果我们知道是 float 类型,所以直接用 Float() 方法。如果不知道具体类型呢?由上面例子可知用 Interface() 方法,然后在进行类型断言 v.Interface().(float64) 来判断获取值
v.Kind() 和 v.Type() 区别:
在 type MyInt int 里,v.Kind() 与 v.Type() 返回了不同的类型值,Kind()返回的是 int,Type() 返回的是 MyInt。在 Go 中,可以用 type 关键字定义自定义类型,Kind() 方法返回底层类型。比如还有结构体,指针等类型用 type 定义的,那么 Kind() 方法就可以获取这些类型的底层类型。