golang 反射的函数和方法的总结

news/2025/1/27 10:00:09/文章来源:https://www.cnblogs.com/yubo-guan/p/18692436

目录
  • 1. reflect.TypeOf()
  • 2. reflect.ValueOf()
  • 3. reflect.Value.Elem()
  • 4. reflect.Value.Set()
  • 5. reflect.Value.Interface()
  • 6. reflect.Value.Kind()
  • 7. reflect.Value.NumField()
  • 8. reflect.Value.Field()
  • 9. reflect.Value.Call()
  • 10. reflect.Value.IsValid()
  • 11. reflect.Value.CanSet()
  • 12. reflect.Value.FieldByName()
  • 13. reflect.Value.SetXxx()
  • 14. reflect.Value.Type()
  • 15. reflect.Value.Index()
  • 总结


在 Go 语言的反射中,reflect 包提供了许多函数和方法来操作类型和值


1. reflect.TypeOf()

  • 功能:获取变量的类型信息。
  • 返回值reflect.Type 类型。
  • 示例
    t := reflect.TypeOf(x)
    fmt.Println("Type:", t) // 输出变量的类型
    

2. reflect.ValueOf()

  • 功能:获取变量的值信息。
  • 返回值reflect.Value 类型。
  • 示例
    v := reflect.ValueOf(x)
    fmt.Println("Value:", v) // 输出变量的值
    

3. reflect.Value.Elem()

  • 功能:获取指针指向的实际值(解引用)。
  • 返回值reflect.Value 类型。
  • 示例
    v := reflect.ValueOf(&x).Elem() // 获取指针指向的值
    

4. reflect.Value.Set()

  • 功能:设置变量的值。
  • 注意:只有可寻址的变量(如指针指向的值)才能被设置。
  • 示例
    v.SetFloat(2.71) // 修改 float64 类型的值
    

5. reflect.Value.Interface()

  • 功能:将 reflect.Value 转换为 interface{} 类型。
  • 返回值interface{} 类型。
  • 示例
    value := v.Interface() // 获取反射值的实际值
    

6. reflect.Value.Kind()

  • 功能:获取变量的底层类型(如 intfloat64struct 等)。
  • 返回值reflect.Kind 类型。
  • 示例
    kind := v.Kind() // 获取变量的底层类型
    

7. reflect.Value.NumField()

  • 功能:获取结构体的字段数量。
  • 返回值int 类型。
  • 示例
    numFields := v.NumField() // 获取结构体的字段数量
    

8. reflect.Value.Field()

  • 功能:获取结构体的某个字段的值。
  • 参数:字段的索引(从 0 开始)。
  • 返回值reflect.Value 类型。
  • 示例
    field := v.Field(0) // 获取结构体的第一个字段
    

9. reflect.Value.Call()

  • 功能:动态调用函数。
  • 参数:函数的参数列表([]reflect.Value 类型)。
  • 返回值:函数的返回值列表([]reflect.Value 类型)。
  • 示例
    result := funcValue.Call(args) // 调用函数并获取返回值
    

10. reflect.Value.IsValid()

  • 功能:检查反射值是否有效(是否存在)。
  • 返回值bool 类型。
  • 示例
    if field.IsValid() {fmt.Println("Field is valid")
    }
    

11. reflect.Value.CanSet()

  • 功能:检查反射值是否可以被设置。
  • 返回值bool 类型。
  • 示例
    if field.CanSet() {field.Set(reflect.ValueOf(newValue))
    }
    

12. reflect.Value.FieldByName()

  • 功能:通过字段名获取结构体的字段值。
  • 参数:字段名(string 类型)。
  • 返回值reflect.Value 类型。
  • 示例
    field := v.FieldByName("Name") // 获取结构体中名为 "Name" 的字段
    

13. reflect.Value.SetXxx()

  • 功能:设置特定类型的值(如 SetIntSetFloatSetString 等)。
  • 示例
    v.SetInt(42)       // 设置 int 类型的值
    v.SetFloat(3.14)   // 设置 float64 类型的值
    v.SetString("Hi")  // 设置 string 类型的值
    

14. reflect.Value.Type()

  • 功能:获取反射值的类型信息。
  • 返回值reflect.Type 类型。
  • 示例
    t := v.Type() // 获取反射值的类型
    

15. reflect.Value.Index()

  • 功能:获取切片、数组或字符串的某个索引处的值。
  • 参数:索引(int 类型)。
  • 返回值reflect.Value 类型。
  • 示例
    elem := v.Index(0) // 获取切片或数组的第一个元素
    

总结

功能 函数/方法
获取类型信息 reflect.TypeOf()
获取值信息 reflect.ValueOf()
解引用指针 reflect.Value.Elem()
设置值 reflect.Value.Set()
获取实际值 reflect.Value.Interface()
获取底层类型 reflect.Value.Kind()
获取结构体字段数量 reflect.Value.NumField()
获取结构体字段值 reflect.Value.Field()
动态调用函数 reflect.Value.Call()
检查值是否有效 reflect.Value.IsValid()
检查值是否可设置 reflect.Value.CanSet()
通过字段名获取字段值 reflect.Value.FieldByName()
设置特定类型的值 reflect.Value.SetXxx()
获取反射值的类型 reflect.Value.Type()
获取索引处的值 reflect.Value.Index()

通过这些函数和方法,Go 的反射机制可以灵活地操作变量、类型和结构体,适用于需要动态处理的场景(如测试框架、序列化工具等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876190.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记忆层以前所未有的方式增强了LLMs

深入探讨记忆层如何工作,以及它们如何增强LLMs,以至于下一代AI架构如果不采用它们,将会错失良机。图像由DALL-E 3生成LLMs(大型语言模型)是存储在其参数中的庞大信息知识库(主要是以密集层中线性矩阵变换的权重形式存在)。 然而,随着参数规模的增长,计算成本和能源消耗…

知识蒸馏技术原理详解:从软标签到模型压缩的实现机制

知识蒸馏是一种通过性能与模型规模的权衡来实现模型压缩的技术。其核心思想是将较大规模模型(称为教师模型)中的知识迁移到规模较小的模型(称为学生模型)中。本文将深入探讨知识迁移的具体实现机制。知识蒸馏原理 知识蒸馏的核心目标是实现从教师模型到学生模型的知识迁移。…

GIS数据合集:作物、植被数据下载平台整理

本文对目前主要的作物类型与产量、植被物候与指数数据产品的获取网站加以整理与介绍~本文对目前主要的作物类型与产量、植被物候与指数数据产品的获取网站加以整理与介绍。 目录4 植被农业数据4.1 作物产量数据4.1.1 SPAM4.1.2 Aerial Intelligence4.2 作物物候数据4.2.1 China…

关于光学?

物理快成唐氏了,写篇笔记记录一下。 光学做题笔记 凸透镜成像规律 或曰:一倍焦距分虚实,二倍焦距分大小; 物近像远像变大,物远像近像变小。一般地,我们称物体到凸透镜的距离为物距(\(u\)),物体所成的像到凸透镜的距离为像距(\(v\))。设下面凸透镜焦距 \(f=10\ cm\):…

一年好景君须记,最是橙黄橘绿时

前言 又双叒叕是一篇流水账——2025 海亮游记。 为什么人们总是怀念过去,因为那里存在着一片静谧而温馨的回忆。文字的记述不能代替那一粒粒记忆碎片。但没有文字,记忆似乎也失去了生命。提笔前夕,云落有想过将用怎样的一种方式串起这些记忆。似乎——它们不用被串起来——它…

音游!

Inverted World雪降Winter ↑ Cube ↓Brain Hacker白复生dBDoll今天不是明天ストレイソウル・アラウンド千紫万红地下城参上SIGMA明镜烈火ReimeiMarenol狂喜兰舞996Crush BetaIntroductionLanota 精选集 已收集2/5You Are The MiserableStasis喵斯 精选集 已收集1/3XINGGOOD 精…

virt-install 创建虚拟机模板

上传 iso 到宿主机 ls -l /data1/iso/ total 4422912 -rw-r--r-- 1 root root 1774077952 Jan 22 08:51 ctyunos-2.0.1-210625-x86_64-dvd.iso -rw-r--r-- 1 root root 2754981888 May 7 2024 ubuntu-24.04-live-server-amd64.iso 创建虚拟磁盘(可选) 创建 qcow2 文件 qemu…

理解ABP的领域驱动设计

大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。关于玩转ABP框架相关的文章,之前在博客园陆续写了《ABP vNext系列文章和视频》,大家可以跳转过去看,后续文章首发主要以CSDN为主。 言归正传,ABP 框…

《HelloGitHub》第 106 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短…

Cisco Nexus 9000v Switch, NX-OS Release 10.5(2)F - 用于网络原型设计和学习研究的虚拟化数据中心交换机

Cisco Nexus 9000v Switch, NX-OS Release 10.5(2)F - 用于网络原型设计和学习研究的虚拟化数据中心交换机Cisco Nexus 9000v Switch, NX-OS Release 10.5(2)F 用于网络原型设计和学习研究的虚拟化数据中心交换机 请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/ 查…

数证杯个人

2024数证杯决赛个人赛wp 容器密码:4zL!$WpRkmANv@XFQ#7HdEyU&GpoTb56YZ^Jq83!Wr(tqA%XsPB7f@CY1xRmKH9#Le*WVG9NuvT$kJ2@7b64Tp(FLM#zqRY8Hv%!KU^9C&YXL*powq87Hr 首先还是感谢强大的队友带我进入了决赛,第一天就上强度,直接个人赛八个小时,原地坐牢四五个小时,赛…

VSCode输出中文乱码

VSCode CMake终端日志乱码在使用CMake插件生成项目时,发现VSCode输出窗口输出的是乱码,这让我感觉很头疼,遂写下这篇博客为后人积累经验。一开始我以为是因为编码的问题导致乱码,于是chcp 65001后重新生成CMake项目,但是发现没有解决,那怕是给VSCode设置gbk编码也是没用。…