温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Go语言中怎么实现结构体反射

发布时间:2021-07-06 16:02:04 来源:亿速云 阅读:133 作者:Leah 栏目:编程语言

本篇文章给大家分享的是有关Go语言中怎么实现结构体反射,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

结构体

type Student struct {     Name   string   `json:"name" describe:"姓名"`     Age    int      `json:"age" describe:"年龄"`     Gender bool     `json:"gender" describe:"性别"`     Hobby  []string `json:"hobby" describe:"爱好"` }

main

func main() {     //实例化结构体     var s1 = Student{         Name:   "张三",         Age:    18,         Gender: true,         Hobby:  []string{"吃", "喝", "pia", "玩"}, }     var t = reflect.TypeOf(s1)     fmt.Println(t.Name())     //Student     fmt.Println(t.Kind())     //struct     fmt.Println(t.NumField()) //结果:4,表示多少个字段     for i := 0; i < t.NumField(); i++ {         field := t.Field(i)//每个结构体对象         /*             {Name  string json:"name" describe:"姓名" 0 [0] false}             {Age  int json:"age" describe:"年龄" 16 [1] false}             {Gender  bool json:"gender" describe:"性别" 24 [2] false}             {Hobby  []string json:"hobby" describe:"爱好" 32 [3] false}         */         //fmt.Println(field)         fmt.Println("------")         fmt.Printf("field.Name:%v\n",field.Name)         fmt.Printf("field.Index:%v\n",field.Index)         fmt.Printf("field.Type:%v\n",field.Type)         fmt.Printf("field.Tag:%v\n",field.Tag.Get("describe"))      } }

执行结果

Go语言中怎么实现结构体反射

单独反射指定字段信息

main代码

func main() {     //实例化结构体     var s1 = Student{         Name:   "张三",         Age:    18,         Gender: true,         Hobby:  []string{"吃", "喝", "pia", "玩"}, }     var t = reflect.TypeOf(s1)     genderField, ok := t.FieldByName("Gender")     if ok {         fmt.Println(genderField.Name)                //Gender         fmt.Println(genderField.Index)               //[2]         fmt.Println(genderField.Type)                //bool         fmt.Println(genderField.Tag.Get("describe")) //性别     } }

ValueOf

上述的代码只能用的是TypeOf,只能返回类型等信息,相对来说不是太智能,ValueOf可以获取值,同样也能获取类型,相对来说比TypeOf好一点。

示例代码

main

func main() {     //实例化结构体     var s1 = Student{         Name:   "张三",         Age:    18,         Gender: true,         Hobby:  []string{"吃", "喝", "pia", "玩"}, }     var v = reflect.ValueOf(s1)     for i := 0; i < v.NumField(); i++ {         field :=v.Field(i)         fmt.Println("------")         fmt.Printf("Kind:%v\n",field.Kind())         fmt.Printf("值:%v\n",field.Interface())     } }

执行结果

 Go语言中怎么实现结构体反射

反射方法

上述我们反射的都是值,有没有反射是否可以反射函数,并且调用函数呢??

结构体和绑定函数代码

type Student struct {     Name   string   `json:"name" describe:"姓名"`     Age    int      `json:"age" describe:"年龄"`     Gender bool     `json:"gender" describe:"性别"`     Hobby  []string `json:"hobby" describe:"爱好"` }  //无参方法 func (this Student) Say() {     fmt.Printf("我是%v,我的年龄是%v,我的性别是%v,我的爱好是%v\n", this.Name, this.Age, this.Gender, this.Hobby) } //有参数方法 func (this Student) Jump(distance int) {     fmt.Printf("我是%v,我跳远跳了%v米\n", this.Name, distance) }

main

func main() {     //实例化结构体     var s1 = Student{         Name:   "张三",         Age:    18,         Gender: true,         Hobby:  []string{"吃", "喝", "pia", "玩"}, }     var t = reflect.TypeOf(s1)     var v = reflect.ValueOf(s1)     fmt.Println(v.NumMethod(),v.NumField())     for i := 0; i < v.NumMethod(); i++ {         method := v.Method(i)         fmt.Println("--------")         fmt.Println(method)//0x48c4e0 函数地址         fmt.Println(method.Type())//func(int) 函数类型,形参和返回值         fmt.Println(t.Method(i).Name)//Jump,函数名,注意,由t来调用的     } }

执行结果

 Go语言中怎么实现结构体反射

反射调用函数

func main() {     //实例化结构体     var s1 = Student{         Name:   "张三",         Age:    18,         Gender: true,         Hobby:  []string{"吃", "喝", "pia", "玩"}, }     var v = reflect.ValueOf(s1)      //通过反射调用函数     //调用Jump函数     //反射调用函数必须传一个参数,不管有没有形参都要传     //var args = []reflect.Value{}     //v.MethodByName("Say").Call(args)      //如果需要传参数     //参数需要用reflect.ValueOf(1) 强转一下      var args = []reflect.Value{reflect.ValueOf(2)}     v.MethodByName("Jump").Call(args) }

注:注意第14行和20行代码区别,如果要传参数,参考第20行代码。

执行结果

Go语言中怎么实现结构体反射

反射注意事项

在平常开发中,尽量慎用反射,原因如下。

  • 反射性能可能会比较低,毕竟是反正走的,一般比正向操作慢一两个级别。

  • 反射越多,代码越烂,TypeOf和ValueOf都有Kind,很多情况是TypeOf和ValueOf混用的,所以对于基础不好的,极不友好。

  • 在Go中,是没有try的,如果反射没有处理好异常,程序会直接崩溃,可能在意想不到的地方。

以上就是Go语言中怎么实现结构体反射,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI