Go进阶之反射
Go语言是静态类型语言.比如int float32 []byte32等等.每个变量都有一个静态类型.并且在编译的时候就已经确定了.type Myint int var i int var j Myint变量i和j不是相同类型.因为二者拥有不同的静态类型.尽管二者底层的类型都是int.但在没有类型转换的情况下是不可以相互赋值的.Go提供了布尔 数值和字符串类型的基础类型.还有一些使用这些类型组成的复合类型.比如数组 结构体 指针 切片 map和channel等.interface 也可以称为一种复合类型1.interface类型:每个interface类型代表一个特定的方法集.方法集中的方法称为接口.示例:type Animal interface { Speak() string }interface变量:就像任何其他类型一样.也可以声明interface类型的变量.示例:var animal Animal type Animal interface { Speak() string }上面的animal变量的值为nil.实现接口:任何类型只要实现了interface类型的所有方法.就可以声称该类型实现了这个接口.该类型的变量就可以存储到interface变量中.示例:type Animal interface { Speak() string } type Dog struct {} func (dog *Dog) Speak() string { return Woof! } func testAnimal() { var animal Animal var dog Dog animal dog }结构体Dog实现了Speak()方法.就可以存储到animal变量中.注:interface变量可以存储任意实现了该接口类型的变量.复合类型:为什么interface可以存储任意实现了该接口类型的变量呢.因为interface类型的变量在存储某个变量时会同时保存变量类型和遍历值.源码位置:src/runtime/runtime2.go:ifacetype iface struct { tab *itab data unsafe.Pointer }tab:保存变量类型(以及方法集).data:变量值位于堆栈的指针.Go的反射就是在运行时操作interface中的值和类型的特性.这是反射的前提.空interface:空interface是一种非常特殊的interface类型.它没有指定任何方法集.如此一来.任意类型都可以声称实现了空接口.那么接口变量也就可以存储任意值.2.反射定律:2.1reflect包:reflect包中提供了reflect.Type和reflect.Value两个类型.分别代表interface中的value和类型.// 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 any) Type { return toType(abi.TypeOf(i)) } // ValueOf returns a new Value initialized to the concrete value // stored in the interface i. ValueOf(nil) returns the zero Value. func ValueOf(i any) Value { if i nil { return Value{} } return unpackEface(i) }1).第一定律:反射可以将interface类型变量转换为反射对象.示例:func main() { var x float64 3.4 //t is reflect.Type t : reflect.TypeOf(x) fmt.Println(t) value : reflect.ValueOf(x) fmt.Println(value) }执行结果:上面的例子中好像没有出现interface变量.实则不然.变量x在传入reflect.TypeOf()函数的时候实际上做了一次类型转换,作为一个空接口传入.reflect.ValueOf()也是如此.这个例子展示了反射可以获取interface变量的类型和值.这是反射进一步操作interface变量的基础.2),第二定律:反射可以将反射对象还原成interface对象.之所以叫反射.是因为反射对象与interface对象是可以相互转换的.示例:func main() { var A interface{} A 100 v : reflect.ValueOf(A) B : v.Interface() if A B { fmt.Println(they ara same) } }执行结果:在上面的函数中.通过reflect.ValueOf()获取接口变量A的反射对象.然后又通过反射对象的Interface()获取B.结果A和B相同.3).第三定律:反射对象可以修改.value值必须是可设置的.通过反射可以将interface类型的变量转换成反射对象.可以使用该反射对象设置interface变量持有的值.可以通过reflect.Value的一系列SetXXX()方法来设置反射对象的值.先看一个失败的例子.示例如下:func main() { var x float64 3.4 v : reflect.ValueOf(x) v.SetFloat(7.1) }执行结果:错误原因是v值是不可修改的.为什么会这样?上面reflect.ValueOf()函数传入的值其实是x的值.不是x本身.通过值修改值是无法影响到x的.是无效的修改.所以会报错.reflect.Value提供了Elem()方法.可以获得指向value的指针.修改示例如下:func main() { var x float64 3.4 v : reflect.ValueOf(x) v.Elem().SetFloat(7.1) fmt.Println(v.Elem().Interface()) }执行结果:山是四季的山.水是山水的水.如果大家喜欢我的分享的话.可以关注我的微信公众号念何架构之路

相关新闻

FPGA FFT缩放因子配置全解析

FPGA FFT缩放因子配置全解析

2026/7/2 20:05:51 阅读更多 →
线程并行控制CompletableFuture

线程并行控制CompletableFuture

2026/5/17 0:18:03 阅读更多 →
.bat脚本新建文件夹【项目结构】

.bat脚本新建文件夹【项目结构】

2026/7/3 13:59:30 阅读更多 →

最新新闻

STM32F745ZG与25CSM04 EEPROM的高效数据存储方案

STM32F745ZG与25CSM04 EEPROM的高效数据存储方案

1. 项目背景与核心需求 在嵌入式系统开发中,非易失性存储器的选择往往决定了数据管理的效率和可靠性。25CSM04作为一款4Mb容量的SPI接口EEPROM,其独特的安全特性和灵活的写保护机制,使其成为需要精确数据检索场景的理想选择。STM32F745ZG则是…

2026/7/3 14:14:46 阅读更多 →
plymouth-theme-kiran自定义教程:教你修改背景色与动画速度 [特殊字符]

plymouth-theme-kiran自定义教程:教你修改背景色与动画速度 [特殊字符]

plymouth-theme-kiran自定义教程:教你修改背景色与动画速度 🎨 【免费下载链接】plymouth-theme-kiran Plymouth theme for KylinSec OS 项目地址: https://gitcode.com/openeuler/plymouth-theme-kiran 前往项目官网免费下载:https:/…

2026/7/3 14:12:46 阅读更多 →
Kiran-Screensaver安全特性解析:保护Linux桌面隐私的完整指南

Kiran-Screensaver安全特性解析:保护Linux桌面隐私的完整指南

Kiran-Screensaver安全特性解析:保护Linux桌面隐私的完整指南 【免费下载链接】kiran-screensaver This program provides screensaver backend. 项目地址: https://gitcode.com/openeuler/kiran-screensaver 前往项目官网免费下载:https://ar.op…

2026/7/3 14:12:46 阅读更多 →
rhostname源码探秘:用Rust实现系统调用的优雅方式

rhostname源码探秘:用Rust实现系统调用的优雅方式

rhostname源码探秘:用Rust实现系统调用的优雅方式 【免费下载链接】rhostname A tool used to perform a series of operations on usernames. It is a reconstruction of the hostname command using Rust. 项目地址: https://gitcode.com/openeuler/rhostname …

2026/7/3 14:10:44 阅读更多 →
GZ3钢三柱暖气片:家用工程怎么选才更耐用、散热更好?

GZ3钢三柱暖气片:家用工程怎么选才更耐用、散热更好?

GZ3-1.2/7-10、GZ3-1.2/6-10、GZ3-1.2/5-10钢三柱暖气片结构成熟、散热稳定、承压可靠、防腐性强,是集中供暖、小区住宅、学校、厂房最常用的经典款,不同高度适配不同空间,安装简单、性价比高、使用寿命长。Steel three-column radiators fea…

2026/7/3 14:08:44 阅读更多 →
多功能采集卡:16路16位500ksps ADC(可测电流)、16路可配置DIO、2路DA、2路DDS输出、2路计数测频、2路PWM多功能采集卡

多功能采集卡:16路16位500ksps ADC(可测电流)、16路可配置DIO、2路DA、2路DDS输出、2路计数测频、2路PWM多功能采集卡

16路高速ADDIODADDSPWM计数测频一体化多功能采集卡解决方案一、方案概述在工业自动化测试、嵌入式硬件标定、动态信号测控、设备性能检测、闭环控制系统开发等场景中,普遍存在多通道高速信号采集、多路逻辑控制、高精度模拟输出、动态信号发生、脉冲时序测控的复合型…

2026/7/3 14:08:44 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻