news 2026/4/23 8:30:43

Go进阶之反射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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:iface

type 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类型的变量转换成反射对象.可以使用该反射对象设置in

terface变量持有的值.可以通过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()) }

执行结果:

山是四季的山.水是山水的水.

如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:19:58

智能声光感应窗帘系统设计

目录智能声光感应窗帘系统概述核心功能模块技术实现要点应用场景与优势扩展功能源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!智能声光感应窗帘系统概述 智能声光感应窗帘系统结合声音识别与光照传感器技术,通过自动化控制…

作者头像 李华
网站建设 2026/4/20 12:24:30

宝塔面板一键部署 Emlog 教程:从服务器准备到站点上线全攻略

文章目录宝塔面板一键部署 Emlog 教程:从服务器准备到站点上线全攻略一、宝塔面板简介二、部署前准备三、宝塔面板安装1. 下载并执行安装脚本2. 访问宝塔面板四、宝塔面板一键部署 Emlog1. 搜索并选择 Emlog2. 填写部署信息3. 部署完成与访问4. 设置管理员账号五、部…

作者头像 李华
网站建设 2026/4/16 14:39:36

微积分:世界是用“微分”写成的,我们是用“积分”读懂的

——试着不用符号理解微积分 🍃 01. 世界是连续变化的 温度不是“突然 5℃”,而是慢慢升的 汽车不是“瞬间到 60 km/h”,而是一点点加速 树不是“咻”一下长高,而是毫米级地生长 河水不是“啪”地冲过去,而是持续…

作者头像 李华
网站建设 2026/4/18 10:46:12

警惕 Shell 脚本中的逻辑陷阱:|| 替代 if-else 引发的安全漏洞

在 Shell 脚本编写中,开发者为了追求简洁,常使用 && 与 || 的短路组合逻辑替代结构化的 if-else 语句。这种看似便捷的写法,实则隐藏着极易被忽视的逻辑陷阱。本文将深入剖析这两种逻辑的核心差异,通过实战案例揭示漏洞成…

作者头像 李华
网站建设 2026/4/18 22:11:20

gops 工具在 Cilium 中的应用指南

目录gops 工具在 Cilium 中的应用指南什么是 gops?Cilium 环境中的 gops 实战演示场景 1: 列出所有 Go 进程场景 2: 获取进程统计信息场景 3: 查看内存统计场景 4: 检查 Goroutine 泄漏Cilium 诊断实战当前节点 (qfusion2 / .148) 状态节点对比分析使用 Prometheus …

作者头像 李华
网站建设 2026/4/19 23:25:17

刘洋洋《爱在照亮》温暖上线 解锁平凡日常里的爱的模样

刘洋洋《爱在照亮》的封面2026 年 1 月 25 日,歌手刘洋洋全新治愈单曲《爱在照亮》正式全平台上线。这首以 “发现爱、守护爱” 为核心的作品,将视角聚焦于生活里那些被匆忙忽略的细碎温暖,用温柔的旋律与走心的歌词,勾勒出藏在日…

作者头像 李华