让我们一起聊一聊反射

2023-08-14 09:08:24 来源: 今日头条
反射的引入

【1】反射可以做什么?

1) 反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别等信息


(资料图)

2) 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)

3) 通过反射,可以修改变量的值,可以调用关联的方法。

4) 使用反射,需要import ("reflect")

【2】反射相关的函数

1) reflect.TypeOf(变量名),获取变量的类型,.Type类型

2) reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型(reflect.Value是一个结构体类型),通过reflect.Value,可以获取到关于该变量的很多信息。

对基本数据类型反射

【1】反射相关的函数

1) reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型

2) reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型(reflect.Value是一个结构体类型),通过reflect.Value,可以获取到关于该变量的很多信息。

【2】代码:

package mainimport ("fmt""reflect")//利用一个函数,函数的参数定义为空接口://空接口没有任何方法,所以可以理解为所有类型都实现了空接口,也可以理解为我们可以把任何一个变量赋给空接口。func testReflect(i interface{})  {//1.调用TypeOf函数,返回reflect.Type类型数据:reType := reflect.TypeOf(i)fmt.Println("reType:",reType)fmt.Printf("reType的具体类型是:%T \n",reType)//2.调用ValueOf函数,返回reflect.Value类型数据:reValue := reflect.ValueOf(i)fmt.Println("reValue",reValue)fmt.Printf("reValue的具体类型是:%T \n",reValue)// num1 := 100//如果真想获取reValue的数值,要调用Int()方法:返回v持有的有符号整数num2 := 80 + reValue.Int()fmt.Println(num2)//reValue转成空接口:i2 := reValue.Interface()n := i2.(int)n2 := n + 30fmt.Println(n2)}func main()  {var num int = 100;testReflect(num)}
对结构体类型反射

【1】反射相关的函数

1) reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型

2) reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型(reflect.Value是一个结构体类型),通过reflect.Value,可以获取到关于该变量的很多信息。

【2】代码:

package mainimport ("fmt""reflect")//利用一个函数,函数的参数定义为空接口://空接口没有任何方法,所以可以理解为所有类型都实现了空接口,也可以理解为我们可以把任何一个变量赋给空接口。func testReflect(i interface{})  {//1.调用TypeOf函数,返回reflect.Type类型数据:reType := reflect.TypeOf(i)fmt.Println("reType:",reType)fmt.Printf("reType的具体类型是:%T \n",reType)//2.调用ValueOf函数,返回reflect.Value类型数据:reValue := reflect.ValueOf(i)fmt.Println("reValue",reValue)fmt.Printf("reValue的具体类型是:%T \n",reValue)// num1 := 100//如果真想获取reValue的数值,要调用Int()方法:返回v持有的有符号整数num2 := 80 + reValue.Int()fmt.Println(num2)//reValue转成空接口:i2 := reValue.Interface()n := i2.(int)n2 := n + 30fmt.Println(n2)}func main()  {var num int = 100;testReflect(num)}
获取变量的类别

【1】获取变量的类别:两种方式:

(1)reflect.Type.Kind()

(2)reflect.Value.Kind()

【2】Kind的值是常量值:

【3】代码:

package mainimport ("fmt""reflect")type Student struct {Name stringAge int}func testReflect(i interface{})  {reType := reflect.TypeOf(i)reValue := reflect.ValueOf(i)//获取变量的类别://(1)reType.Kind()k1 := reType.Kind()fmt.Println(k1)//(2)reValue.Kind()k2 := reValue.Kind()fmt.Println(k2)//获取变量的类型:i2 := reValue.Interface()n,flag := i2.(Student)if flag == true {fmt.Printf("结构体的类型是:%T",n)}}func main()  {stu := Student{Name: "菜园子",Age: 18,}testReflect(stu)}

【4】Type和 Kind 的区别

Type是类型, Kind是类别,Type和Kind 可能是相同的,也可能是不同的.

比如:var num int = 10 num的Type是int , Kind也是int

比如:var stu Studentstu的 Type是 pkg1.Student , Kind是struct

通过反射修改变量

修改基本数据类型的值:

package mainimport ("fmt""reflect")func testReflect(i interface{})  {reValue := reflect.ValueOf(i)//通过SetInt()来改变值:reValue.Elem().SetInt(50)}func main()  {var num int = 100//传入指针地址testReflect(&num)fmt.Println(num)}
通过反射操作结构体的属性和方法

【1】代码:(熟知API)

package mainimport ("fmt""reflect")type Student struct {Name stringAge int}//给结构体绑定方法:func (s Student) Print()  {fmt.Println("调用了Print()方法")fmt.Println("学生的名字是:",s.Name)}func (s Student) GetSum(n1,n2 int) int{fmt.Println("调用了GetSum()方法")return n1 + n2}func (s Student) Set(name string,age int)  {s.Name = names.Age = age}//定义函数操作结构体进行反射操作:func TestStudentStruct(a interface{})  {//a转成reflect.Value类型:val := reflect.ValueOf(a)fmt.Println(val)//通过reflect.Value类型操作结构体内部的字段:n1 := val.NumField()fmt.Println(n1)//遍历-获取具体的字段:for i := 0; i < n1; i++ {fmt.Printf("第%d个字段的值是:%v \n",i+1,val.Field(i))}//通过reflect.Value类型操作结构体内部的方法:n2 := val.NumMethod()fmt.Println(n2)//调用Print()方法://调用方法,方法的首字母必须大写才能有对应的反射的访问权限    //方法的顺序按照ASCII的顺序排列的,a,b,c,,,,,,索引:0,1,2,,,val.Method(1).Call(nil)//调用GetSum方法://定义Value的切片:var params []reflect.Valueparams = append(params,reflect.ValueOf(10))params = append(params,reflect.ValueOf(20))result := val.Method(0).Call(params)fmt.Println("GetSum方法的返回值是:",result[0].Int())}func main()  {stu := Student{Name: "菜园子",Age: 19,}TestStudentStruct(stu)}
通过反射修改变量

【1】代码:

package mainimport ("fmt""reflect")type Student struct{Name stringAge int}func (s Student) Print() {fmt.Println("调用了Print()方法")fmt.Println("学生的姓名是:",s.Name)}func (s Student) GetSum(n1,n2 int) int {fmt.Println("调用了GetSum()方法")return n1 + n2}func (s Student) Set(name string,age int)  {s.Name = names.Age = age}func TestReflectStuct(a interface{})  {//a转成reflect.Value类型:val := reflect.ValueOf(a)fmt.Println(val)n := val.Elem().NumField()fmt.Println(n)//修改字段的值:val.Elem().Field(0).SetString("Idea")}func main()  {stu := Student {Name: "菜园子",Age: 19,}TestReflectStuct(&stu)fmt.Println(stu)}

参考源码:golang-demo: golang学习

标签:

让我们一起聊一聊反射

反射的引入【1】反射可以做什么?1)反射可以在运行时动态获取变量的各

08-14 09:08:24

大学生花2天1夜从长沙坐公交到武汉 全程只花98.9元:网友热议穷游不可取

在大学生群体中,流行起一种独特的旅游方式——全国公交游,对此你怎么

08-14 09:07:07

江苏各地积极探索夜间消费新业态新场景 解锁生活新姿态

此外,还要在提升文化内涵上做文章,在营造消费场景上出实招,加强城市

08-14 08:46:34

遍地按摩椅,别让消费者避之不及

当高铁站的普通休息座椅所剩无几,取而代之的是“坐不完”的按摩椅,原

08-14 08:26:19

国家自然科学基金委员会:整治科研项目评审“打招呼”

日前,备受科研人员关注的2023年国家杰出青年科学基金项目、优秀青年科

08-14 07:52:58

河道还有“盲肠段”?上海这些水体反复黑臭居民难忍,如何才能根治?

近日,解放夏令行动陆续收到来自闵行区和松江区市民的几则求助,称家附

08-14 07:33:56

国脚吴少聪,土甲首发打满全场!助球队2-1开门红,拿后防最高分

国脚吴少聪,土甲首发打满全场!助球队2-1开门红,拿后防最高分,土甲,

08-14 07:04:20

已93人遇难!美国百年来最致命大火,幸存者曝光可怕细节

美国夏威夷州毛伊岛野火遇难人数继续攀升截至目前大火造成的死亡人数升

08-14 07:01:43

飞机忘记密码怎么办_飞信密码忘了怎么办

飞机忘记密码怎么办,飞信密码忘了怎么办这个很多人还不知道,现在让我

08-14 06:24:27

dstt微压焖烧锅_dstt

1、1、TF卡是内存2、你说的像gba卡样的卡3、那就是DSTT卡本身4、也就是

08-14 05:44:45

克洛普:队内有很多优秀的年轻球员,我满心欢喜并充满热情

克洛普:队内有很多优秀的年轻球员,我满心欢喜并充满热情,英超,利物浦

08-14 04:16:20

妈妈家常菜炸肉丸子的做法?

步骤 方式1准备干馒头步骤 方式2泡水10分钟沥干水分步骤 方式3肉剁成泥

08-14 02:43:10

中国智慧科技如何成就世界级领先?

金属线圈与磁铁转出了电流从此,社会文明的齿轮开始高速转动如今智慧科

08-14 00:51:56

文件夹里的文件隐藏了怎么显示出来 文件隐藏了怎么显示出来

1、控制面板>文件夹选项>查看>隐藏和显示文件>选显示所有。相信通过文

08-13 23:02:59

王思聪吃热狗的行为(传王思聪吃热狗

hello大家好,我是城乡经济网小晟来为大家解答以上问题,王思聪吃热狗

08-13 22:11:35

恒投证券(01476):金融街投资同意就新华基金所欠债务以工商银行为受益人提供担保

恒投证券(01476)发布公告,就执行和解协议:金融街投资(西城区国资委的

08-13 21:40:25

OPPO K10 Pro 怎么查看电池损耗

OPPOK10Pro怎么查看电池损耗是很多用户关心的问题,如果您想了解这些疑

08-13 20:48:04

伊布杂图-171

以下图片来源pixiv作者:しゆるめ以下图片来源pixiv作者:のっぴき以下

08-13 20:19:41

杭城笑星齐聚下沙,好戏连台上演“欢乐四重奏”

潮新闻讯近日,杭州滑稽艺术剧院文艺轻骑兵走进下沙街道,用曲艺说唱、

08-13 19:36:38

打击黄牛、延长服务、无理由退货,湖南暑期旅游新举措

三湘都市报8月13日讯(全媒体记者曾冠霖王普)今年暑期,为增强游客的

08-13 19:27:37

钻石铂金被“抛弃”,黄金珍珠成年轻人“心头好”,到底怎么火的?

“钻石恒永久,一颗永流传”,曾几何时,钻石在饰品消费市场的地位首屈

08-13 18:25:23

歌幂吧证据(歌幂吧)

导读1、我觉得呢,歌幂弘诗处得那么靠 诗诗在幂博客跟她叫嫂子 诗如

08-13 18:07:22

H85铜棒,H85黄铜棒性能

(15317736925)H85黄铜棒材、H85黄铜板材、H85黄铜带材、H85黄铜毛细

08-13 17:42:38

植物人父亲用尽全力给儿子盖被子 曾为救人从6米高的屋顶跌落摔伤 具体是什么情况?

【植物人父亲用尽全力给儿子盖被子曾为救人从6米高的屋顶跌落摔伤】具

08-13 17:05:28

人保财险启动预赔付机制助力企业灾后迅速恢复生产

为坚决贯彻关于防汛工作的重要指示批示精神,全面落实国家金融监督

08-13 16:51:03

吴某某、何某某当场被抓!厦门正严查!

注意!注意!厦门重磅出击严查!严查!全面严查!又有多人先后被抓速速

08-13 16:02:27

加的斯中锋奥斯马伊奇已经在西甲联赛完成注册,下场...

加的斯中锋奥斯马伊奇已经在西甲联赛完成注册,下场对阵阿拉维斯的比赛

08-13 15:54:47

一个“旧衣”展登陆上海,你可以找到陈坤、孙俪、李宇春等最有故事的挚爱旧衣

有人说,衣服是有生命力的,一道褶皱就是一段故事;也有人说,一件旧衣

08-13 15:23:55

网友质疑发展电动车是不是走错了:给出三大理由

网友质疑发展电动车是不是走错了:给出三大理由

08-13 14:49:46

十款24小时真人上下分的捕鱼手游分享

很多玩家想知道手游资讯游戏中十款24小时真人上下分的捕鱼手游分享,本

08-13 14:09:00

word文档如何对文字进行字数统计 word中文字数统计

生活中有些事情需要用到文字统计,比如写文章,段子时候等等。下面就教

08-13 13:08:31

丰田“迷你酷路泽”预告图曝光 基于纯电平台打造 预计明年上市

快科技8月13日消息,近日,丰田CompactCruiserEV的预告图正式曝光,该

08-13 13:05:17

写工作总结时不足应该怎么写(如何写工作总结中的不足)

写工作总结时不足应该怎么写,如何写工作总结中的不足这个很多人还不知

08-13 11:59:46

呆头变帅(比呆头更帅的人)

我是小前,我来为大家解答以上问题。呆头变帅,比呆头更帅的人很多人还

08-13 11:46:18

一战题材生存策略新游戏《最后的归家列车》预告片!

THQ在最近的发布会上公布了一款新游戏《最后的归家列车(LastTrainHome

08-13 11:10:54

东风柳汽和东风汽车的关系(东风柳汽)

1、刚打电话给在柳汽工作的师兄,他说柳汽还不错,刚去的话一个月有两

08-13 11:06:55

关于电信星卡39元套餐,你了解多少?

我办的是电信星卡39元套餐,现在还不清楚里面包含的内容能给我简略介绍

08-13 10:15:40

跟着课本去打卡!暑期旅游旺季 多种玩法“上新”

正值暑期旅游度假的高峰,多个平台数据显示旅游市场进一步“升温”,据

08-13 09:54:12

香港特区政府官员:美投资限制禁令不影响香港创科发展

就此,香港特区政府创新科技及工业局局长孙东12日在电台节目上表示,香

08-13 09:41:47

段永平,中美通吃

文|小卢鱼编辑|杨旭然8月刚开始,由巴菲特掌舵的伯克希尔·哈撒韦公司

08-13 09:20:46

河北省普通话考试报名时间上半年 河北省普通话考试报名时间

1、你可以咨询河北省语言文字培训测试中心联系,联系人:曹昭、马美茹

08-13 09:00:31

俄称成功拦截袭击克里米亚大桥导弹 乌称大桥两次发生爆炸

[新闻页-台海网]综合新华社驻外记者报道:俄国防部12日发布消息说,俄

08-13 08:16:47

假如我会分身术

N平湖市实验小学教育集团209班管道骊爸爸出国工作了,家里忙成了一锅粥

08-13 07:41:25

腹胀腹痛的原因(腹胀腹痛是什么原因)

1、引起腹胀腹痛的原因有很多,由于肛肠疾病,如急慢性肠炎、溃疡性结

08-13 07:14:18

老君越换防冻液要几升(君越多久更换一次防冻液?)

君越(参数|询价)两年或四万公里更换一次防冻液,君越生产厂商为上汽通

08-13 06:02:45

集资诈骗案量刑标准

集资诈骗罪的量刑,主要看个人或者单位诈骗的数额。集资诈骗罪达到数额

08-13 05:57:05

一片绿叶的回忆阅读答案四年级_一片绿叶的回忆阅读答案

1、一 1 一片绿叶引起的回忆2 不置不否娓娓珍藏安然长逝3 尊贵甜美谦逊

08-13 04:07:24

渴望春天莫扎特(关于渴望春天莫扎特的基本详情介绍)

大家好我是小蝌蚪,渴望春天莫扎特,关于渴望春天莫扎特的基本详情介绍

08-13 02:46:09

“篮球之城”东莞燃起夏日战火!石碣“村BA”激情开打!

(记者 陈伟峰剪辑 实习生魏蔓淇)火热夏季,激情来袭!自7月下旬起,

08-13 00:53:45

蒋颖(关于蒋颖简述)

,你们好,今天0471房产来聊聊一篇颖,颖简述的文章,网友们对这件事情

08-12 23:25:00

你好 我的城 ︱西城发在行动—秦岭北麓储备地管护工作纪实
群联展示最新 E27T PCIe 4.0 SSD 主控:支持 3600 MT/s 闪存
丹书铁券:雪球中的稳健大师
膈应是哪里方言 膈应
安徽所有专科学校排名公办 安徽公办专科学校有哪些
一加&AAC仿生触感实验室成立,推高手机触感行业上限
中融信托让人胆战心惊的“朋友圈”:恒大、融创、华夏幸福…
诺泰生物童梓权:企业要通过革新技术、提高效率来确保成长空间
感人热刺球迷:这不是再见,而是回头见,伟大的凯恩!
工业和信息化部:尽快将受灾地区通信服务恢复至正常水平
问界之后,牵手奇瑞,不造车的华为已经胜过造车
焦点访谈丨齐心协力 重建家园
东北大学好不好?
24岁清华博士毕业,她将任985高校准聘副教授!
C16酸异辛酯商品报价动态(2023-08-12)
总投资超90亿元,这家医院突然申请注销!发生了什么?
手机相关知识:为什么snkrs不能更新国家地区
千年之旅公测礼包兑换码汇总介绍
新版国家基本公共服务标准出台
中间继电器基础知识图解 中间继电器详解)
梅西骑到队友身上 布斯克茨:能再跟梅西当队友很好 基本情况讲解
炸裂网红下海史,太毁三观
日文名字随机生成器(日文名字)
云从科技:上半年营收1.64亿元,净亏损3.04亿元
“凝眸青绿 生态徐州”专题监督助力“无废城市”建设
第二十九届丝绸之路吐鲁番葡萄节将于8月19日举行
中医教你一个补精,益气,养血的方法,专调身体疲惫无力(1)精虚腿
做 假 支 票/存 单
上半年我国光伏产业快速发展
Cortana 退出舞台:微软 Win11 普通用户已无法使用该应用
20AH大电池 9号 BMAX60智能电动车优惠至4349元
乌波翻脸已成定数,波兰人不再遮遮掩掩,直接表示必须夺回故土
cng是什么意思(CNg车标用什么好?)
看完电影回来,杭州一对情侣全身长满红疹!最近中招的人不少
2023快手光合创作者大会:将投入4000亿+流量 助力创作者变现超千亿
西安秦岭北麓沣峪突发山洪 210国道中断 有人员失联
安徽省呼吸罕见病专科联盟成立
中医正骨手法治疗脚腕扭伤
常山北明(000158):8月11日北向资金减持77.13万股
华为p50开机键在哪
超级大反转!切尔西1.1亿+反截胡利物浦,凯塞多拒赴安菲尔德
门禁系统由什么组成的(门禁系统由什么组成)
初秋一定要有的风衣,跟着安吉丽娜的思路选,太时髦了!
break a leg是什么意思中文_break a leg是什么意思
房源短缺推高房价 美国房地产市值达47万亿美元创新高
宜城市有奖募捐委员会办公室(关于宜城市有奖募捐委员会办公室简述)
兄弟科技:上半年净利4494.48万元 同比减80.51%
2022年丰台区引入首店49家
名将出战 花滑俱乐部联赛海拉尔站10日开赛
关于违规数学竞赛,中国民办教育协会再发提醒
X 广告
资讯
X 广告

Copyright ©  2015-2022 西南畜牧网版权所有  备案号:皖ICP备2022009963号-8   联系邮箱:39 60 29 14 2@qq.com