广告
返回顶部
首页 > 资讯 > 精选 >Go语言中怎么实现结构体反射
  • 799
分享到

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

2023-06-15 20:06:00 799人浏览 泡泡鱼
摘要

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

本篇文章给大家分享的是有关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)//每个结构体对象                  //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语言中怎么实现结构体反射,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Go语言中怎么实现结构体反射

本文链接: https://www.lsjlt.com/news/281526.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言中怎么实现结构体反射
    本篇文章给大家分享的是有关Go语言中怎么实现结构体反射,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体type Student struct ...
    99+
    2023-06-15
  • go语言怎么反射
    Go语言反射是通过reflect包来实现的。在反射中的类型有:1、reflect.Type,代表了一个Go语言类型的元数据;2、reflect.Value,代表了一个值的元数据。Go语言是一种静态类型的编程语言,它提供了一种称为反射(ref...
    99+
    2023-07-10
  • go语言结构体怎么赋值
    在Go语言中,结构体的赋值可以通过两种方式进行:1. 通过字段名逐个赋值:可以使用`结构体变量名.字段名`的方式进行赋值。例如:``...
    99+
    2023-10-10
    go语言
  • go语言string转结构体的实现
    在 Go 语言中,可以使用标准库中的 encoding/json 包将 JSON 格式的字符串转换为结构体。 假设有以下 JSON 字符串: { "name": "鸡哥", ...
    99+
    2023-03-19
    go语言string转结构体 go string 结构体
  • Go语言中的Struct结构体
    一、Struct结构体 Go语言中没有像C#、Java一样的Class,只有Struct这样的结构体。Go语言使用type关键字来定义一个类型。 如下: type User stru...
    99+
    2022-11-13
  • Go语言中的反射怎么用
    这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述在程序运行期对程序动态的进行访问和修改reflect godoc: https://golang.org/pkg/reflect...
    99+
    2023-06-25
  • go语言string转结构体如何实现
    这篇“go语言string转结构体如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言string转结构体如何实现...
    99+
    2023-07-05
  • Go语言中的Struct结构体怎么声明
    这篇文章主要介绍了Go语言中的Struct结构体怎么声明的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的Struct结构体怎么声明文章都会有所收获,下面我们一起来看看吧。一、Struct结构体Go语言...
    99+
    2023-07-02
  • 怎么使用Go语言基础结构体
    本篇内容主要讲解“怎么使用Go语言基础结构体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Go语言基础结构体”吧!概述结构体是由一系列具有相同类型或不同类型的数据构成的数据集合语法定义结...
    99+
    2023-06-25
  • Go语言空结构体是什么
    这篇文章主要为大家展示了“Go语言空结构体是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言空结构体是什么”这篇文章吧。什么是空结构体我们说不包含任何字段的结构体叫做空结构体,可以通过...
    99+
    2023-06-28
  • Go语言中如何使用结构体
    这篇文章将为大家详细讲解有关Go语言中如何使用结构体,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。结构体结构体是 go 语言中一个比较重要的概念,在 c  语言中也有类似的东西。由...
    99+
    2023-06-15
  • Go语言中结构体如何使用
    本篇文章为大家展示了Go语言中结构体如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。结构体Go语言中的基本数据类型可以表示一些事物的基本属性,但是当我们想表达...
    99+
    2022-10-18
  • go语言通过反射创建结构体、赋值、并调用对应的操作
    我就废话不多说了,大家还是直接看代码吧~ package main import ( "fmt" "reflect" "testing" ) type Call struct...
    99+
    2022-06-07
    反射 GO 调用 结构体 赋值 go语言
  • go语言结构体指的是什么
    这篇文章主要介绍“go语言结构体指的是什么”,在日常操作中,相信很多人在go语言结构体指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言结构体指的是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-04
  • Go语言中的反射是什么
    本篇内容介绍了“Go语言中的反射是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是反射反射,嗯...,就是反着的意思呗,就是把东西反...
    99+
    2023-06-15
  • Go语言中结构体的作用是什么
    这篇文章给大家介绍Go语言中结构体的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。自定义类型type 自定义类型名 类型名 例: type NewInt&nb...
    99+
    2023-06-15
  • golang怎么用反射reflect操作结构体
    这篇文章给大家分享的是有关golang怎么用反射reflect操作结构体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以...
    99+
    2023-06-14
  • Go语言反射reflect.Value实现方法的调用
    目录引言func (Value) Call通过反射,调用方法。通过反射,调用函数。引言 这算是一个高级用法了,前面我们只说到对类型、变量的几种反射的用法,包括如何获取其值、...
    99+
    2022-11-13
  • Go语言中如何使用结构体构造函数
    这篇文章将为大家详细讲解有关Go语言中如何使用结构体构造函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Go语言的结构体 构造函数下面的代码就实现了一个P...
    99+
    2022-10-18
  • go语言中结构体方法如何定义
    本篇内容主要讲解“go语言中结构体方法如何定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中结构体方法如何定义”吧!go语言中结构体方法的定义方法:1、定义一个结构体,语法“type ...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作