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()) }

执行结果:

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

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

念何架构之路

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

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

相关文章

2026 年 1 月仿古瓦厂家推荐排行榜,中式仿古瓦,小青瓦仿古瓦,定制仿古瓦,古建屋面瓦公司推荐,甄选匠心工艺与耐久品质!

2026年1月仿古瓦厂家推荐排行榜:甄选匠心工艺与耐久品质 随着文化自信的回归与文旅产业的蓬勃发展,中式仿古建筑及传统风貌街区建设迎来了新一轮热潮。作为承载建筑神韵与历史文脉的关键元素,仿古瓦,尤其是中式仿古…

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

一、源码 当有原来的同名文件时保留原来的文件夹【仅限文件夹同名保留】 NewFile.bat echo off chcp 65001 > nul 2>&1 setlocal enabledelayedexpansion:: 获取脚本所在的文件夹路径 set "script_dir%~dp0" echo echo 目标创建路径:%script_…

2026 年 1 月工业醇类及溶剂厂家推荐榜单:乙醇/无水乙醇/二丙酮醇/异丙醇/乙二醇/正丁醇/工业酒精/甲醇/醇酸漆稀释剂/丙二醇甲醚等源头实力厂家精选

2026 年 1 月工业醇类及溶剂厂家推荐榜单:乙醇/无水乙醇/二丙酮醇/异丙醇/乙二醇/正丁醇/工业酒精/甲醇/醇酸漆稀释剂/丙二醇甲醚等源头实力厂家精选 在精细化工与制造业的庞大体系中,工业醇类及溶剂扮演着不可或缺的…

2025年教我学英语 - 穿、衣

2025年教我学英语 - 穿、衣1、穿、戴 - wear [weə(r)] 穿、着 - put on [ˈpʊt ɒn] 穿、戴(状态)-dress [dres] 穿、套 - wear in [ˈweə(r) ɪn] 试穿 - try on [ˈtraɪ ɒn]2、衣服 - clothes [kləʊz] 外套…

探索Matlab水下图像处理与GUI界面构建之旅

数字图像处理matlab水下图像处理,gui 界面运用,有讲解报告 在数字图像处理的广袤领域中,水下图像处理因其独特的挑战而备受关注。Matlab作为一款强大的工具,为我们解决水下图像处理难题提供了丰富的资源和便捷的途径。同时&#…

快过年了 , 我就简简单单写一个总结吧 ! | 马年快乐 !

1. 项目正式上线了 书接上回 , 经过一个月的不懈努力 , 我和另一个哥们终于把这个项目 (帮学校做校园宿舍报修系统小程序) 拿下了. 但是这边宿管长这边又出了点状况: 因为这个项目是为学校做公益,没有问宿管长要一分钱. 但是服务器的钱肯定是要宿管长联系学校那边给报销一下…

FPGA FFT缩放因子配置全解析

目录 前言 1.快速傅里叶变换(FFT) 1.1 FFT的来源 1.2 FFT IP 缩放因子设置实例 缩放配置的底层含义:16haaaa 每一级的计算与“减肥”过程 输入准备:24 位原始数据 Stage 1:第一次蝶形运算 Stage 2&#x…

线程并行控制CompletableFuture

并行执行两个任务A和B。主线程等待时间最长为3s。所以A和B,单独运行的时长最长也是3s。 且如果A和B都没有超时,那么优先取A的值。否者谁不超时,就取谁。 线程池单个提交 比如下面的代码,先提交了两个异步任务,此时都…

2026 年 1 月酯类溶剂厂家推荐排行榜,正丙酯/乙酯/丁酯/醋酸丁酯/乙酸乙酯/丙二醇甲醚醋酸酯/工业碳酸二甲酯/精甲酯,高纯度环保溶剂实力供应商精选

2026 年 1 月酯类溶剂厂家推荐排行榜:高纯度环保溶剂实力供应商精选 在精细化工、涂料油墨、电子清洗、医药合成等众多现代工业领域,酯类溶剂扮演着不可或缺的角色。正丙酯、乙酸乙酯、醋酸丁酯、丙二醇甲醚醋酸酯(…

SB-Flink入门 202601125

SB-Flink入门 202601125

完整教程:创建混合工程:OpenHarmony Stage 模型 + Flutter 模块标准结构详解

完整教程:创建混合工程:OpenHarmony Stage 模型 + Flutter 模块标准结构详解2026-01-25 18:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

【EF Core】实体状态与变更追踪

好长时间没有水文章了,请容老周解释一下。因为最近老周进了两个厂,第一个厂子呆了八天左右,第二个厂子还在调试。管理很严格,带的电子设备都要登记、办手续。当初觉得雷神笔记本的屏幕大,在车间调试代码方便,所以…

漏洞与利用程序:厘清网络安全中的弱点与攻击

漏洞与利用程序:了解弱点与攻击之间的差距 一个漏水的屋顶是漏洞。那场暴雨就是利用程序。一个是条件,另一个是事件。 想一下你的手机。屏幕角落的那道小划痕?那就是一个漏洞。它是一个缺陷,一个薄弱点。它就静静地待在那里。 现在…

大面额沃尔玛购物卡哪里回收更安心?三招教你避开风险陷阱

消费习惯的改变,让不少人手中积攒了未使用的大面额沃尔玛购物卡,闲置浪费,回收变现成了迫切需求。但沃尔玛购物卡回收市场良莠不齐,怎样选到安全可靠的渠道?本文从风险对比与解决方案入手,帮你找到安心回收之选。…

【洛谷】二分查找专题 告别二分死循环!模板 + 细节 + 实战 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年教我学英语 - 美食

2025年教我学英语 - 美食一、基础饮食动作1、吃、进食 - eat [iːt] 喝、饮用 - drink [drɪŋk] 尝、品尝 - taste [teɪst] 嚼、咀嚼 - chew [tʃuː] 吞、吞咽 - swallow [ˈswɒləʊ]2、烹饪、煮 - cook [kʊk] 煎…

2026年1月高纯度溶剂厂家推荐榜单:乙烷/甲基环己烷/二氯甲烷/环己烷/正己烷/二甲苯/三甲苯/四甲苯/甲基苯,专业级精细化工原料供应商精选

2026年1月高纯度溶剂厂家推荐榜单:乙烷/甲基环己烷/二氯甲烷/环己烷/正己烷/二甲苯/三甲苯/四甲苯/甲基苯,专业级精细化工原料供应商精选 在精细化工、新材料合成、医药中间体制备及高端电子化学品等领域,高纯度有机…

导师严选2026 10款一键生成论文工具测评:本科生毕业论文必备清单

导师严选2026 10款一键生成论文工具测评:本科生毕业论文必备清单 2026年学术写作工具测评:为本科生毕业论文提供高效解决方案 随着高校对学术规范要求的不断提高,本科生在撰写毕业论文过程中面临诸多挑战,如文献检索效率低、格式…

腾讯混元大模型本地安装与Elasticsearch连接实战指南

本文详细介绍了腾讯混元大模型的本地部署过程,包括通过Ollama安装GGUF量化版本、配置参数、创建自定义模型并运行。随后展示了如何将混元模型连接到Elasticsearch,包括配置OpenAI兼容服务、创建Connector、上传文档并在Playground中进行测试。整个过程提…

程序员必备:100行代码实现极简LLM框架,告别依赖地狱,轻松构建智能体应用

PocketFlow是一个仅用100行代码实现的极简LLM框架,解决了主流框架过于臃肿、依赖复杂的问题。它将LLM应用建模为简单的有向图结构(节点流共享存储),支持智能体、工作流、RAG等所有主流AI设计模式。框架零依赖、无厂商锁定&#xf…