Go-反射
概念
在Go语言中,反射(reflection)是指在运行时检查程序的结构、变量和接口的机制。可以通过反射获取和修改变量的值、获取变量的类型信息、调用方法等操作。
反射主要由reflect包提供,它定义了两个重要的类型:Type和Value。Type代表一个Go类型的元数据,Value则代表一个变量的值和类型信息。
通过反射,可以动态地获取变量类型信息和值,例如使用reflect.TypeOf()可以获取变量的类型,使用reflect.ValueOf()可以获取变量的值。还可以使用Value提供的方法获取和设置变量的值、调用方法等。
需要注意的是,反射操作相对较慢,使用反射会带来一定的性能损失。因此,应尽量避免过度使用反射,谨慎地选择使用反射机制。
// ValueOf returns a new Value initialized to the concrete value
// stored in the interface i. ValueOf(nil) returns the zero
func ValueOf(i interface{}) Value {...}翻译一下:ValueOf用来获取输入参数接口中的数据的值,如果接口为空则返回0// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.
func TypeOf(i interface{}) Type {...}翻译一下:TypeOf用来动态获取输入参数接口中的值的类型,如果接口为空则返回nil
例子
执行reflect的两个接口
func main() {var num float64 = 1.2345fmt.Println("type: ", reflect.TypeOf(num))fmt.Println("value: ", reflect.ValueOf(num))// type: float64// value: 1.2345}
针对reflect的两个接口返回值进一步探索
package mainimport ("fmt""reflect"
)type User struct {Id intName stringAge int
}func (u User) ReflectCallFunc() {fmt.Println("Allen.Wu ReflectCallFunc")
}
func main() {user := User{1, "Allen.Wu", 25}DoFiledAndMethod(user)}// 通过接口来获取任意参数,然后一一揭晓
func DoFiledAndMethod(input interface{}) {getType := reflect.TypeOf(input)fmt.Println("get Type is :", getType.Name())getValue := reflect.ValueOf(input)fmt.Println("get all Fields is:", getValue)// 获取方法字段// 1. 先获取interface的reflect.Type,然后通过NumField进行遍历// 2. 再通过reflect.Type的Field获取其Field// 3. 最后通过Field的Interface()得到对应的valuefor i := 0; i < getType.NumField(); i++ {field := getType.Field(i)value := getValue.Field(i).Interface()fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)}// 获取方法// 1. 先获取interface的reflect.Type,然后通过.NumMethod进行遍历for i := 0; i < getType.NumMethod(); i++ {m := getType.Method(i)fmt.Printf("%s: %v\n", m.Name, m.Type)}
}
反射设置值
package mainimport ("fmt""reflect"
)func main() {var num float64 = 1.2345fmt.Println("old value of pointer:", num)// 通过reflect.ValueOf获取num中的reflect.Value,注意,参数必须是指针才能修改其值pointer := reflect.ValueOf(&num)newValue := pointer.Elem()fmt.Println("type of pointer:", newValue.Type())fmt.Println("settability of pointer:", newValue.CanSet())// 重新赋值newValue.SetFloat(77)fmt.Println("new value of pointer:", num)// 如果reflect.ValueOf的参数不是指针,会如何?pointer = reflect.ValueOf(num)// newValue = pointer.Elem() // 如果非指针,这里直接panic,“panic: reflect: call of reflect.Value.Elem on float64 Value”
}
reflect.Indirect()函数
package mainimport ("fmt""reflect"
)type MyStruct struct {ID int
}func (s *MyStruct) DoSomething() {fmt.Println("Hello world")
}func main() {s := &MyStruct{ID: 123}v := reflect.ValueOf(s) // v.Kind() is reflect.Ptrfmt.Println(v.Kind()) // ptrv1 := reflect.ValueOf(s).Elem() // v.Kind() is reflect.Ptrfmt.Println(v1.Kind()) // struct
}
显然,v.Kind()的返回值是reflect.Ptr,而不是MyStruct类型。这时,我们可以使用reflect.Indirect()在反射中获取原始类型。
package mainimport ("fmt""reflect"
)type Person struct {name stringage int
}func main() {p1 := &Person{name: "Alice", age: 30}v1 := reflect.ValueOf(p1)fmt.Println("v1.Kind():", v1.Kind())fmt.Println("v1.Type():", v1.Type())fmt.Println("v1.CanSet():", v1.CanSet())fmt.Println("v1.Elem().CanSet():", v1.Elem().CanSet())v1 = reflect.Indirect(v1)fmt.Println("v1.Kind():", v1.Kind())fmt.Println("v1.Type():", v1.Type())fmt.Println("v1.CanSet():", v1.CanSet())//fmt.Println("v1.Elem().CanSet():", v1.Elem().CanSet())
}
输出
v1.Kind(): ptr
v1.Type(): *main.Person
v1.CanSet(): false
v1.Elem().CanSet(): true
v1.Kind(): struct
v1.Type(): main.Person
v1.CanSet(): true
// panic: reflect: call of reflect.Value.Elem on struct Value
相关文章:
Go-反射
概念 在Go语言中,反射(reflection)是指在运行时检查程序的结构、变量和接口的机制。可以通过反射获取和修改变量的值、获取变量的类型信息、调用方法等操作。 反射主要由reflect包提供,它定义了两个重要的类型:Type和…...
【深度学习】DeepSpeed,ZeRO 数据并行的三个阶段是什么?
文章目录 ZeRO实验实验设置DeepSpeed ZeRO Stage-2 实验性能比较进一步优化DeepSpeed ZeRO Stage-3 和 CPU 卸载结论ZeRO ZeRO(Zero Redundancy Optimizer)是一种用于分布式训练的大规模深度学习模型的优化技术。它通过分片模型状态(参数、梯度和优化器状态)来消除数据并行…...
代码随想录算法训练营第三十六天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
一、1049. 最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 文章讲解:代码随想录 (programmercarl.com)——1049. 最后一块石头的重量 II 视频讲解:动态规划之背包问题,这个…...
Pandas行列变换指南:数据重塑的艺术
数据分析中,数据的形态至关重要。pandas库提供了一系列工具,让我们能够轻松地重塑数据。以下是一些常见的pandas行列变换方法,每种方法都配有完整的代码示例。 环境准备 首先,确保你的环境中安装了pandas和numpy库: …...
1.MySQL面试题之innodb如何解决幻读
1. 写在前面 在数据库系统中,幻读(Phantom Read)是指在一个事务中,两次读取同一范围的数据集时,由于其他事务的插入操作,导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎ÿ…...
Nginx中$http_host、$host、$proxy_host的区别
知识巩固! 网上看到这篇文章,这里转载记录一下。 简介 变量是否显示端口值是否存在 host 浏览器请求的ip,不显示端口 否 "Host:value"显示 值为a:b的时候,只显示a http_host 浏览器请求的ip和端口号 是"Host:v…...
C# Unity 面向对象补全计划 七大原则 之 里氏替换(LSP) 难度:☆☆☆ 总结:子类可以当父类用,牛马是马,骡马也是马
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章ÿ…...
PXE批量安装操作系统
PXE批量安装操作系统 系统环境rhedhat7.9关闭vmware内的dhcp服务 kickstart自动安装脚本的制作 在rhel7系统中提供图形的kickstart制作方式 在rhel8中已经把图形的工具取消,并添加到rhn网络中 在rhel8中如果无法通过rhn网络制作kickstart,可以使用模板…...
float32转float16、snorm/sunorm8/16 学习及实现
1、基础 彻底搞懂float16与float32的计算方式-CSDN博客 例1:float32 0x3fd00000 32b0 011_1111 _1 101_0000_0000_0000_0000_0000 sign0 exp8b0111_1111 h7f d127 >0ffset 127-127 0 mantissa b101_0000_0000_0000_0000_0000(补1,1.1010…...
小型养猫空气净化器怎么选?小型养猫空气净化器产品评测
家养四只猫猫,对于各个角落的猫毛,感觉家里已经被猫毛占领了。感受一下40度高温的养猫人,给掉毛怪疏毛浮毛飘飘,逃不过的饮水机,各个角落,多猫拉臭传来的异味。 一、养猫带来的麻烦 掉毛:每到换…...
数学建模--二分法
目录 二分法的基本原理 应用实例 求解方程根 查找有序数组中的元素 注意事项 Python代码示例 编辑 延伸 二分法在数学建模中的具体应用案例有哪些? 如何选择二分法的初始区间以确保收敛速度和精度? 在使用二分法求解方程时,如何…...
如何使用 Puppeteer 绕过 Akamai
摘要: 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时,如何运用Puppeteer这一强大的Node.js库,通过模拟真实用户行为、动态请求处理等策略,高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…...
【硬件知识】车规级开发等级——AEQ-100和ISO26262标准
文章目录 一、定义二、区别1.应用场景2.使用方法 总结 一、定义 AEQ-100(Automotive Electronics Council Q100)是一个由汽车电子委员会(AEC)制定的标准,主要用于保证汽车电子元件的可靠性。它是一个关于汽车级半导体…...
Qt | QStackedBarSeries(堆叠条形图)+QPercentBarSeries(堆叠百分比条形图)
点击上方"蓝字"关注我们 01、QBarSet 1. 首先,需要创建一个名为QBarSet的类。 2. 在QBarSet类中,定义所需的属性和方法。 3. 属性可能包括条形的名称、颜色、值等。 4. 方法可能包括添加条形、删除条形、计算总和等。 5. 确保QBarSet类能够与QBar类协同工作,…...
C++——多态经典案例(一)组装电脑
案例:小明打算买两台组装电脑,假设电脑零部件包括CPU、GPU和内存组成。 一台电脑使用intel的CPU、GPU和内存条 一台电脑使用Huawei的CPU、GPU和Intel的内存条 分析:使用多态进行实现 将CPU、GPU和内存条定义为抽象类,内部分别定义…...
从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案
随着科技的飞速发展和社会的不断进步,视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域,EasyCVR视频汇聚平台凭借其强大的多协议接入能力,在复杂多变的网络环境中展现出了卓越的性能和广泛的应…...
Windows下,已知程序PID,取得其窗口句柄HWND
我需要实现这么一个功能:在知道某个程序的PID的情况下,最大化并且置顶显示这个程序的窗口。经过一番资料的查找,并且借助了一些科技的力量,找到了解决办法: struct FindWindowData {DWORD processId;HWND hWnd; };BOO…...
Java获取exe文件详细信息:产品名称,产品版本等
使用Maven项目,在pom.xml文件中注入: <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码: import …...
ORB-SLAM2运行环境搭建
操作系统:Ubuntu20.04 1.安装Eigen3 推荐大家安装版本 3.2.10 链接:https://eigen.tuxfamily.org/index.php?titleMain_Page mkdir build cd build cmake .. sudo make install2.安装Pangolin 推荐安装0.5版本 链接:https://github.com…...
Nginx高频核心面试题2
目录 高级问题1. **Nginx中如何实现URL重写?**2. **如何在Nginx中设置基本的HTTP身份验证?**3. **如何限制Nginx中的请求速率?**4. **如何在Nginx中设置自定义错误页面?**5. **Nginx的worker_processes和worker_connections参数有…...
FPGA实战:手把手教你用Vivado的MMCM IP核动态调整ADC采样时钟相位(附仿真避坑指南)
FPGA实战:Vivado MMCM动态相位调整的工程化实现与深度避坑指南 在高速数据采集系统中,ADC采样时钟相位的精确控制往往是决定信号完整性的关键因素。当FPGA工程师发现采样数据存在周期性抖动或眼图闭合时,动态调整时钟相位便成为优化系统性能的…...
高性能无线基带FPGA实现:开源802.11 WiFi实时信号处理架构解析
高性能无线基带FPGA实现:开源802.11 WiFi实时信号处理架构解析 【免费下载链接】openwifi open-source IEEE 802.11 WiFi baseband FPGA (chip) design: driver, software 项目地址: https://gitcode.com/gh_mirrors/op/openwifi Openwifi是一个基于软件定义…...
飞机上吸烟还叫嚣“憋得难受”?
坐飞机最怕遇到什么?不是延误,也不是颠簸,而是那种不拿一飞机人性命当回事的“巨婴”旅客。就在昨天(3月29日),四川航空一架从成都飞往尼泊尔加德满都的航班上,就出了这么一档子事儿。一位“老烟…...
ESP32 TCP服务端避坑指南:从端口复用到KeepAlive,这些配置项你真的懂了吗?
ESP32 TCP服务端深度配置实战:从端口复用到KeepAlive参数调优 在物联网设备开发中,TCP服务端的稳定性往往决定着整个系统的可靠性。许多开发者在使用ESP32搭建TCP服务端时,虽然能够快速实现基础通信功能,但当面临多设备连接、网络…...
r5:天气预测
- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/o-DaK6aQQLkJ8uE4YX1p3Q) 中的学习记录博客** - **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 文章目录 概要整体架构流程代码运行技术名词解释小…...
Figma设计稿秒变Vue代码?实测Trae AI的“图像转代码”功能,还原度到底有多高
Figma设计稿秒变Vue代码?实测Trae AI的"图像转代码"功能还原度与实战应用 设计师与前端开发者的协作痛点由来已久。当Figma画布上精美的界面设计需要转化为实际可运行的代码时,往往意味着数小时的像素级测量、CSS编写和响应式调试。这种设计到…...
局域网内Windows时间同步配置
本文详细介绍了如何配置NTP服务器和工作站计算机进行时间同步,包括在服务器上启用NTP服务,调整同步设置,以及在海康威视录像机上的应用。同时提醒注意防火墙配置问题。 一、配置NTP服务器 1、在局域网内找一台时间可靠的计算机或服务器 做为N…...
M2LOrder模型Python爬虫实战:应对动态渲染与数据加密网站
M2LOrder模型Python爬虫实战:应对动态渲染与数据加密网站 最近有个朋友找我帮忙,说他们公司需要从某个网站上抓取一些商品数据,但试了好几个爬虫工具都搞不定。我一看,好家伙,这网站不仅数据是页面加载完才动态生成的…...
告别单调模型!FreeCAD‘逐面着色’保姆级教程:从颜色理论到3D打印预览
告别单调模型!FreeCAD‘逐面着色’保姆级教程:从颜色理论到3D打印预览 在3D设计领域,模型的美观度往往决定了第一印象。你是否遇到过这样的困境:精心建模的作品因为单调的色彩而失去表现力?FreeCAD的逐面着色功能正是打…...
手把手教你用MounRiver Studio开发沁恒CH32V003(附完整项目实战)
从零开始用MounRiver Studio开发沁恒CH32V003:温度控制器实战指南 当RISC-V遇上国产MCU,会碰撞出怎样的火花?沁恒CH32V003作为一款性价比极高的RISC-V内核微控制器,配合MounRiver Studio这一专为RISC-V优化的开发环境,…...
