马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、从范例对象中获取名称和种类
- const (
- Zero int = 0
- )
- func main() {
- type stu struct{}
- typeofCat := reflect.TypeOf(stu{})
- fmt.Println(typeofCat.Name(), typeofCat.Kind()) //显示反射类型对象名称和种类
- typeOfA := reflect.TypeOf(Zero)
- fmt.Println(typeOfA.Name(), typeOfA.Kind())
- }
复制代码 2、利用反射获取布局体的成员范例
方法分析Field(i int) StructField根据索引规返回索引对应的布局字段的信息,当值不是布局体或索引越界会发生宕机NumField() int返回布局体成员字段数量,当范例不是布局体或索引越界时发生宕机FieldByName(name string) (StructField bool)根据给定字段返回字符串对应的布局体字段的信息,没有找到时bool返回false,当范例不是布局体或索引越界时发生宕机FieldByIndex(index[]int) StructField多层成员访问时,根据[]iny 提供的每个布局体的字段索引,返回字段的信息,没有找到返回零值。当范例不是布局体或索引越界时发生宕机FieldByNameFunc(match func(string) bool)(StructField,bool)根据匹配函数匹配必要的字段,当值不是布局体或索引越界时发生宕机3、从反射值对象中获取值的方法
方法名分析Interface() interface{}将值以interface{}范例返回,可以通过范例断言为指定范例Int() int64将值以int范例返回,全部有符号整数均可以此方式返回Uint() uint64将值以uint范例返回,全部无符号整数均可以此方式返回Float() float64将值以双精度范例返回,全部浮点数(float32,float64)均可以此方式返回Bool() bool将值以bool范例返回Bytes() []bytes将值以字节数组[]bytes范例返回String() string将值以字符串范例返回- func main() {
- var m int = 2021
- valueOfA := reflect.ValueOf(m)
- var getA int = valueOfA.Interface().(int)
- var getA2 int = int(valueOfA.Int())
- fmt.Println(getA, getA2)
- }
复制代码 4、利用反射访问布局体的成员字段的值
方法分析Field(i int) Value根据索引对应的布局体成员字段的反射对象,当值不是布局体或索引越界时发生宕机NumField() int返回给布局体成员字段数量 ,当值不是布局体或索引越界时发生宕机FieldByName(name string) Value根据给定字符串返回字符串对应的布局体字段,没有找到时返回零值,当值不是布局体或索引越界时发生宕机FieldByIndex(index []int) Value多层成员返回时,根据[]int提供的每个布局体的字段索引,返回字段的值,没有找到时返回零值,当值不是布局体或索引越界时发生宕机FieldByNameFunc(match func(string) bool) value根据匹配函数匹配必要的字段,找到时返回零值,当值不是布局体或索引越界时发生宕机- type stu struct {
- a int
- b string
- float32
- bool
- next *stu
- }
- func main() {
- d := reflect.ValueOf(stu{
- next: &stu{},
- })
- fmt.Println("numField", d.NumField())
- floatField := d.Field(2)
- fmt.Println("floatField", floatField.Type())
- //根据名称查找字段
- fmt.Println("FieldsByName().Type", d.FieldByName("b").Type())
- fmt.Println("FieldByIndex()", d.FieldByIndex([]int{4, 0}).Type())
- }
复制代码 5、反射对象的空和有效性判断
| 方法 | 分析 |
| IsNil() bool | 返回值是否为nil,假如值范例不是通道(channel)、函数、接口、map、指针切片,类似于语言层的v==nil操纵|
| IsValid() bool | 判断值是否有效。当值本身非法时,返回false,如reflect Value不包罗任何值,值为nil等|
- func main() {
- var a *int
- fmt.Println("var a *int:", reflect.ValueOf(a).IsNil())
- fmt.Println("nil:", reflect.ValueOf(nil).IsValid())
- fmt.Println("*int nil:", reflect.ValueOf((*int)(nil)).Elem().IsValid())
- s := struct{}{}
- fmt.Println("struct:", reflect.ValueOf(s).FieldByName("").IsValid())
- fmt.Println("并不存在的结构体方法:", reflect.ValueOf(s).MethodByName("").IsValid())
- m := map[int]int{}
- fmt.Println("不存在的键:", reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid())
- }
复制代码 6、判断及获取元素的干系方法
方法名分析Elem() Value取值指向的元素值,类似于语言层* 操纵,当值范例不是指针或接口时发生宕机,空指针时返回nil的ValueAddr() Value对寻址的值返回其地点,类似于语言层&操纵,当值不可寻址时发生宕机CanAddr() bool表现值是否可寻址CanSet() bool返回值可否被修改,要求值可寻址且是导出的字段7、值修改的干系方法
Set(x Value)将值设置为传入反转值对象的值SetUint(x uint64)利用uint64设置值,当值的范例不是uint,uint8,uint16,uint32,uint64会发生宕机SetInt(x int64)比上面少了uSetFloat(x float64)利用float54设置值,当值的范例不是float32,float64发生宕机SetBool(x bool)利用bool设置值,当值的范例不是bool时发生宕机SetBytes(x []byte)设置字节数组[] bytes值,当值的范例不是[]byte 会发生宕机SetString(x string)设置字符串值.当值的范例不是string时会发生宕机
- func main() {
- a := 1024
- valueOfA := reflect.ValueOf(&a)
- valeOfEl := valueOfA.Elem()
- valeOfEl.SetInt(100)
- fmt.Println(a)
- }
复制代码- func main() {
- type Dog struct {
- LegCount int
- }
- valueOfDog := reflect.ValueOf(&Dog{})
- valueOfDog = valueOfDog.Elem()
- vLegCount := valueOfDog.FieldByName("LegCount")
- vLegCount.SetInt(3)
- fmt.Println(vLegCount.Int())
- }
复制代码 8、通过范例创建范例
创建了新的范例
- func main() {
- var a int
- typeOfA := reflect.TypeOf(a)
- aIns := reflect.New(typeOfA)
- fmt.Println(aIns.Type(), aIns.Kind())
- }
复制代码 9、利用反射调用函数
- func add(a, b int) int {
- return a + b
- }
- func main() {
- funcValue := reflect.ValueOf(add)
- paramList := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}
- retList := funcValue.Call(paramList)
- fmt.Println(retList[0].Int())
- }
复制代码 10、常用反射API
从实例到Value
- func ValueOf(i interface{}) Value
复制代码 从实例到Type
- func TypeOf (i interface{}) Type
复制代码 从Type到Value
- func NewAt (type Type,p unsafe.Pointer) Value
复制代码 从Value到Type
- func (v Value) Type() Type
复制代码 从Value到实例
- func (v Value) Interface() (i interface{})
- func (v Value) Bool() bool
- func (v Value) Float() float64
- func (v Value) Int() int64
- func (v Value) Uint() uint64
复制代码 从Value的指针到值
- func (v Value) Elem() Value
- func Indirect(v Value) Value
复制代码 Type指针和值相互转换
- t.Elem() Type //指针类型Type到值类型Type
- func PtrTo(t Type) Type
复制代码 Value值的可修改性
- func (v Value) CanSet() bool
- func (v Value) Set(x Value)
复制代码 |