并且People继承PeopleParent
@H_404_30@package main@H_404_30@import ( "fmt" "reflect")@H_404_30@type PeopleParent @H_404_30@struct { Kaka string}@H_404_30@type People @H_404_30@struct { PeopleParent name string Age int}
定义一个方法为了在使用value接口演示使用 @H_404_30@func (p People) Eat(name string) { fmt.Println("咔咔在吃什么呢!", name) p.name = name}
在main函数里边我们把People结构体的对象给创建出来 创建了机构对象并且复制给P 并且调用了typeAPI方法,把p传入进去
@H_404_30@func main() { p := People{ PeopleParent: PeopleParent{Kaka: "咔咔的父类属性"}, name: "咔咔", Age: 24, } typeAPI(p) valueAPI(p)}
开始我们的typeAPI的一些接口 @H_404_30@func typeAPI(obj @H_404_30@interface{}) { // 返回保存值的类型 oType := reflect.TypeOf(obj) fmt.Println(oType) // main.People // 原始类型 kind := oType.Kind() fmt.Println(kind) // struct // 类型名称 fmt.Println(oType.name()) // People // 属性和方法的个数 fmt.Println(oType.NumFIEld()) // 2 fmt.Println(oType.NumMethod()) // 0 // 获取全部属性 @H_404_30@for i := 0; i < oType.NumFIEld(); i++ { structFIEld := oType.FIEld(i) // name string age int fmt.Println(structFIEld.name, structFIEld.Type) } // 获取全部方法 @H_404_30@for i := 0; i < oType.NumMethod(); i++ { structMethod := oType.Method(i) fmt.Println(structMethod.name, structMethod.Type) } // 获取父类的属性 []int{0,0}获取第0个父类 第0个属性 fmt.Println(oType.FIEldByIndex([]int{0, 0}).name)}
value的一些接口 在这里我们需要注意的是方法传入的是结构体的值并非指针
在修改属性值时是传的指针,这点看清楚
我们看到的是elem也可以调用结构体的方法
我们代码的一开始是ValueOf§ 如果改为*p也是跟elem一样的
valueOf := reflect.ValueOf(&p) byEat := valueOf.MethodByname("Eat") byEat.Call([]reflect.Value{reflect.ValueOf("西瓜")}) fmt.Println(valueOf)
@H_404_30@func valueAPI(p People) { valueOf := reflect.ValueOf(p) // 获取所有属性值 @H_404_30@for i := 0; i < valueOf.NumFIEld(); i++ { value := valueOf.FIEld(i) // {} //咔咔 //24 fmt.Println(value) } // 获取父类属性 fIEldByIndex := valueOf.FIEldByIndex([]int{0, 0}) fmt.Println(fIEldByIndex.Interface()) // 咔咔的父类属性 // 获得指针value的内容进而获得成员的值 valuePrt := reflect.ValueOf(&p) elem := valuePrt.Elem() value := elem.FIEld(0).Interface() fmt.Println(value) //{咔咔的父类属性} // 根据属性名获取值 age := elem.FIEldByname("Age") fmt.Println("咔咔的年龄", age) // 咔咔的年龄 24 // 修改属性值 elem.FIEldByname("Age").SetInt(26) fmt.Println(elem) //{{咔咔的父类属性} 咔咔 26} // 调用对象的方法 mValue := elem.MethodByname("Eat") // 参数需要反射 mValue.Call([]reflect.Value{reflect.ValueOf("西瓜")}) fmt.Println(elem) //咔咔在吃什么呢! 西瓜}
完整代码 @H_404_30@package main@H_404_30@import ( "fmt" "reflect")@H_404_30@type PeopleParent @H_404_30@struct { Kaka string}@H_404_30@type People @H_404_30@struct { PeopleParent name string Age int}@H_404_30@func (p People) Eat(name string) { fmt.Println("咔咔在吃什么呢!", name) p.name = name}@H_404_30@func main() { p := People{ PeopleParent: PeopleParent{Kaka: "咔咔的父类属性"}, } typeAPI(p) valueAPI(p)}@H_404_30@func typeAPI(obj @H_404_30@interface{}) { // 返回保存值的类型 oType := reflect.TypeOf(obj) fmt.Println(oType) // main.People // 原始类型 kind := oType.Kind() fmt.Println(kind) // struct // 类型名称 fmt.Println(oType.name()) // People // 属性和方法的个数 fmt.Println(oType.NumFIEld()) // 2 fmt.Println(oType.NumMethod()) // 0 // 获取全部属性 @H_404_30@for i := 0; i < oType.NumFIEld(); i++ { structFIEld := oType.FIEld(i) // name string age int fmt.Println(structFIEld.name, 0}).name)}@H_404_30@func valueAPI(p People) { valueOf := reflect.ValueOf(p) //valueOf := reflect.ValueOf(&p) //byEat := valueOf.MethodByname("Eat") //byEat.Call([]reflect.Value{reflect.ValueOf("西瓜")}) //fmt.Println(valueOf) // 获取所有属性值 @H_404_30@for i := 0; i < valueOf.NumFIEld(); i++ { value := valueOf.FIEld(i) // {} //咔咔 //24 fmt.Println(value) } // 获取父类属性 fIEldByIndex := valueOf.FIEldByIndex([]int{0, age) // 咔咔的年龄 24 // 修改属性值 elem.FIEldByname("Age").SetInt(26) fmt.Println(elem) //{{咔咔的父类属性} 咔咔 26} // 调用对象的方法 mValue := elem.MethodByname("Eat") // 参数需要反射 mValue.Call([]reflect.Value{reflect.ValueOf("西瓜")}) fmt.Println(elem) //咔咔在吃什么呢! 西瓜}
博主微信欢迎交流 总结 以上是内存溢出为你收集整理的【GO】一篇文章带你看透反射的原理全部内容,希望文章能够帮你解决【GO】一篇文章带你看透反射的原理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)