Golang语言社区GoWorld

go语言反射的总结

2018-01-04  本文已影响14人  吃猫的鱼0

首先巴拉巴拉一下golang反射机制的三个定律

reflect的基本使用

对象类型的基本操作

dataStruct := reflect.Indirect(reflect.ValueOf(obj))//获取对象的Value对象
dataStruct.Kind()//数据是什么类型:slice切面.Struct对象
dataStruct.NumField()//属性的个数
dataStruct.FieldByName("")//利用属性名获取属性
dataStruct.Field(1)//获取第几个属性
reflect.New(dataStruct.Type())//创建一个新的对象
dataStruct.Type()//对象的类型

属性的操作

dataStruct.FieldByName("")//利用属性名获取属性
dataStruct.Field(1)//获取第几个属性
fieldName := field.Name//属性的名称
fieldValue:=field.Interface()//获取属性值
bb := field.Tag//获取属性的标记
columnTag := bb.Get("column")//获取表中列的标记
field.Set(sliceValue)//给属性重新赋值

切片类型的基本操作

reflect.TypeOf(slice).Elem()//获取切片的Struct类型
reflect.New(reflect.TypeOf(slice).Elem())//创建一个新的切面包含对象类型
sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型

reflect的内置对象

结构的字段具有很多特殊信息,定义了StructField类型来表示一个字段

        func NumField() int     //结构字段数量
        func Field(i int) StructField       //使用索引来访问字段,索引从0开始,如果越界将panic
        func FieldByName(name string) (StructField,bool)        //使用名称来访问字段,如果未找到那么返回false
        func FieldByNameFunc(match func(string) bool) (StructField,bool)        //访问名称使得match函数返回true的字段,在同一个内嵌层次上,只能有一个字段使得match返回true。如果同一层次上多个字段使得match返回true,
                                                                                那么这些字段都认为是不符合要求的
        func FieldByIndex(index []int) StructField      //这个方法使得访问结构的内嵌字段成为可能。将访问各个层次的字段的索引排列起来,就形成了一个[]int,参数index不可越界,否则panic             

        type StructField struct{
            Name string      //名称
            PkgPath string      //* 对于导出字段,为空字符串* 对于非导出字段,是定义该字段类型的包名
            Type        Type
            Tag         StructTag
            Offset uintptr     //在结构内的位移
            Index []int       //当使用Type.FieldByIndex()方法的参数
            Anonymous  bool        //是否为匿名字段
        }

reflect包使用Kind类型来表示类型所属的分类

上一篇下一篇

猜你喜欢

热点阅读