我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang reflect反射如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang reflect反射如何使用

这篇文章主要介绍“Golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。

    首先有一段以下结构体的定义

    type User struct {UserName stringUserId   int `name:"uid"`}

    初始化一个结构体的实例

    u := User{"octoboy", 101}

    获取字段名

    首先获取变量的Type变量

    t := reflect.TypeOf(u)

    需要注意的是,如果传入的u是个指针,比如&User{"octoboy", 101}

    if t.Kind() == reflect.Ptr {t = t.Elem()}

    这里通过Kind()函数获取变量的类型,判断如果类型为指针 需要使用Elem()获取指针指向的内容。

    然后遍历结构体的字段,获取其字段名称

    for i := 0; i < t.NumField(); i++ {fmt.Println(t.Field(i).Name)}

    输出结果:

    UserName

    UserId

    获取字段类型和值

    v := reflect.ValueOf(u)if v.Kind() == reflect.Ptr { //类型为指针 需要取elemv = v.Elem()}

    获取字段的值或者赋值,需要用到ValueOf方法

    for i := 0; i < v.NumField(); i++ {//v.Field(i).Int() v.Field(i).String() 都可以把值返回出来,相当于断言 类型不匹配会直接panic//直接断成interface 任意类型fmt.Println(v.Field(i).Interface())}

    输出结果:

    zyg

    101

    继续输出成员变量的类型

    for i := 0; i < v.NumField(); i++ {fmt.Println(v.Field(i).Kind())}

    输出结果:

    string

    int

    设置字段值

    静态赋值

    //设置字段值va := reflect.ValueOf(&u) //这里必须使用指针 否则后面调用Set无法使用无地址的值if va.Kind() == reflect.Ptr { //类型为指针 需要取elem 意为取它指向的内容值va = va.Elem()for i := 0; i < va.NumField(); i++ {//两种方法取设置字段的值,第二种更为统一if va.Field(i).Kind() == reflect.String {//重要 如果需要使用set取修改u中的值,需要在ValueOf中传入u的地址。否则会因为SetString使用了一个不能被寻址的值而造成panicva.Field(i).SetString("octoboy")}if va.Field(i).Kind() == reflect.Int {va.Field(i).Set(reflect.ValueOf(123))}}

    interface切片映射成结构体(动态赋值)

    //练手values := []interface{}{"octoboy", 123}for i := 0; i < va.NumField(); i++ {if reflect.ValueOf(values[i]).Kind() == va.Field(i).Kind() {va.Field(i).Set(reflect.ValueOf(values[i]))}}

    打印以上两种结构题变量

    输出结果:

    &{octoboy 123}

    进阶&mdash;map映射成结构体

    有如下代码

    //练习 把map映射成structset := map[string]interface{}{"UserName": "zyg","UserId":   101,"Age":      19,"Sex":      1,}user := &User{}MapToStruct(set, user)fmt.Println(user)

    要求将map映射到user结构题中,即如果User的字段名如存在于map的key中,则将对应的value值赋给user结构题的成员变量

    有如下实现

    //str类型为interface{} 代表可以传入任意的结构体func MapToStruct(m map[string]interface{}, str interface{}) {val := reflect.ValueOf(str)if val.Kind() != reflect.Ptr {//必须是指针 否则无法用Set赋值panic(any("must be ptr!"))}val = val.Elem()if val.Kind() != reflect.Struct { //指针指向的必须是结构体panic(any("must be struct"))}for i := 0; i < val.NumField(); i++ {name := val.Type().Field(i).Name //value转type后取字段名称if v, ok := m[name]; ok {        //如果根据tag做映射,就使用val.Type().Field(i).Tag.Get("name")作为keyif reflect.ValueOf(v).Kind() == val.Field(i).Kind() {val.Field(i).Set(reflect.ValueOf(v))}}}}

    关于“Golang reflect反射如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Golang reflect反射如何使用

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

    下载Word文档

    猜你喜欢

    Golang reflect反射如何使用

    这篇文章主要介绍“Golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。首先有一段以下结构体的定义t
    2023-07-06

    Golang reflect反射的使用实例

    Golang反射的错误大多数都来自于调用了一个不适合当前类型的方法,而且,这些错误通常是在运行时才会暴露出来,而不是在编译时,如果我们传递的类型在反射代码中没有被覆盖到那么很容易就会panic,本文就介绍一下使用go反射时很大概率会出现的错误,需要的可以参考一下
    2023-05-15

    深入了解Golang中reflect反射的使用

    这篇文章主要介绍了深入了解Golang中reflect反射的使用,Go语言中的反射是一种机制,可以在运行时动态地获取类型信息和操作对象,以及调用对象的方法和属性等,需要详细了解可以参考下文
    2023-05-20

    怎么分析Golang的反射reflect

    本篇文章为大家展示了怎么分析Golang的反射reflect,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这
    2023-06-29

    Golang反射模块reflect使用方式示例详解

    Golang的反射功能,在很多场景都会用到,最基础的莫过于rpc、orm跟json的编解码,更复杂的可能会到做另外一门语言的虚拟机,这篇文章主要介绍了Golang反射模块reflect使用方式探索,需要的朋友可以参考下
    2023-01-04

    golang怎么用反射reflect操作结构体

    这篇文章给大家分享的是有关golang怎么用反射reflect操作结构体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以
    2023-06-14

    深入了解Golang中reflect反射基本原理

    反射是这样一种机制,它是可以让我们在程序运行时(runtime)访问、检测和修改对象本身状态或行为的一种能力。本文主要带大家来看看Golang中reflect反射基本原理,需要的可以参考一下
    2023-01-04

    golang 如何使用反射创建新类型

    利用反射,go 允许创建新类型,1. 使用 reflect.typeof() 获取现有类型的 reflect.type 值;2. 使用 reflect.new() 创建新类型的指针值;3. 通过 *ptr.elem() 访问实际值;4. 反
    golang 如何使用反射创建新类型
    2024-05-01

    一文带你了解Golang中reflect反射的常见错误

    go 反射的错误大多数都来自于调用了一个不适合当前类型的方法, 而且,这些错误通常是在运行时才会暴露出来,而不是在编译时,如果我们传递的类型在反射代码中没有被覆盖到那么很容易就会 panic。本文就介绍一下使用 go 反射时很大概率会出现的错误,需要的可以参考一下
    2023-01-05

    Java反射如何使用

    这篇文章将为大家详细讲解有关Java反射如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。反射相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的
    2023-06-25

    C#反射如何使用

    这篇文章主要讲解了“C#反射如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#反射如何使用”吧!explicit 和 implicit 的含义?explicit 和 implicit
    2023-06-18

    golang 如何使用反射动态修改变量值

    go 语言反射允许在运行时操控变量值,包括修改布尔值、整数、浮点数和字符串。通过获取变量的 value,可以调用 setbool、setint、setfloat 和 setstring 方法进行修改。例如,可以解析 json 字符串为结构体
    golang 如何使用反射动态修改变量值
    2024-05-02

    怎么使用Python reflect单例模式反射各个函数

    这篇文章主要介绍“怎么使用Python reflect单例模式反射各个函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Python reflect单例模式反射各个函数”文章能帮助大家解决问
    2023-06-30

    Golang反射机制怎么使用

    本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍反射的本质就是在程序运行的时候,获
    2023-06-30

    Go如何利用反射reflect实现获取接口变量信息

    本篇内容主要讲解“Go如何利用反射reflect实现获取接口变量信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go如何利用反射reflect实现获取接口变量信息”吧!引言反射是通过实体对象获
    2023-06-30

    golang 如何使用反射实现动态代理模式

    go中使用反射实现动态代理答案: 是的,可以通过反射在go中实现动态代理模式。步骤:创建自定义代理类型,包含目标对象引用和方法处理逻辑。为代理类型创建代理方法,在调用目标方法前或后执行额外逻辑。使用反射动态调用目标方法,使用reflect.
    golang 如何使用反射实现动态代理模式
    2024-05-01

    如何使用Java反射机制

    这篇文章主要介绍“如何使用Java反射机制”,在日常操作中,相信很多人在如何使用Java反射机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java反射机制”的疑惑有所帮助!接下来,请跟着小编一起来
    2023-06-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录