第13章 反射

反射的引入

【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学习

参考博客:cyz

标签:

尼日利亚一清真寺坍塌至少10人死亡

据尼日利亚媒体报道,发生坍塌的清真寺是当地知名的历史建筑,始建于19

08-13 06:43:47

excel忘记密码怎么解开(excel忘记密码怎么打开)

来为大家解答以上的问题。excel忘记密码怎么解开,excel忘记密码怎么打

08-13 05:04:21

庇的拼音_庀

1、庀 读音:[pǐ]部首:广五笔:YXV释义:1 治理:“内朝,子将~季氏之

08-13 01:08:42

河北等16个受灾地区保险机构已赔付14.5亿元

新华社北京8月12日电(记者吴雨、李延霞)记者12日从国家金融监督管理

08-12 22:34:46

盛健羊乳:擦亮数智化、规模化养殖底色,从源头做好奶

据李俊介绍,创立以来,盛健羊乳一直在坚持“养好羊,做好奶”的原则,

08-12 20:52:13

吉林扶余组建心理咨询队 为集中安置群众服务

日前,拉林河2023年第1号洪峰过境吉林省扶余市,当地集中转移安置了沿

08-12 19:55:16

剑与远征霜息冰原凤凰怎么打 剑与远征霜息冰原怎么过

剑与远征霜息冰原凤凰怎么打?剑与远征本次新奇境霜息冰原整体上其实是

08-12 18:29:00

FGO泳装加雷斯简评:20%充能剑光炮,起到一个很好的装饰作用

FGO国服泳装七期活动一池的四星从者为剑阶加雷斯,这里为大家介绍一下

08-12 17:38:05

黑龙江水运铁路抢修今日完成货运恢复

8月12日电,受台风“卡努”北上影响,国铁哈尔滨局客运、货运线路防洪

08-12 16:25:31

俄称挫败乌无人机对克里米亚的袭击

俄罗斯媒体12日援引俄国防部发布的消息报道说,当地时间12日凌晨,俄军

08-12 14:57:33

7月产销同比增长超三成,新能源汽车延续良好发展态势

新华社北京8月12日电题:7月产销同比增长超三成,新能源汽车延续良好发

08-12 13:53:33

盈利后的快手要和老铁一起“赚钱” 4000亿+流量扶持创作者上变现“快车”

8月10日,以“热爱,让收获更多”为主题的2023快手光合创作者大会在上

08-12 12:50:36

上海中西医结合医院整形美容科怎么样正规吗?口碑,简介奉上!

上海中西医结合医院整形美容科上海中西医结合医院是一所特色鲜明的三级

08-12 11:40:12

人人爱猫猫!《流浪》登Xbox英国付费游戏榜榜首

据游戏推主JamieMoran报道,猫猫游戏《流浪》登顶Xbox英国地区付费游戏榜。

08-12 10:48:19

江苏省徐州市2023-08-12 09:45发布高温黄色预警

一、江苏省徐州市天气预报1、丰县气象台2023年08月12日09时43分继续发

08-12 10:05:19

河北计划两年完成灾后重建

河北计划两年完成灾后重建

08-12 09:19:34

微电生理(688351)8月11日主力资金净买入146.62万元

截至2023年8月11日收盘,微电生理(688351)报收于16 03元,上涨0 19%,

08-12 08:23:19

LOUD!~憂鬱をぶっとばせ~ by miwa

本专栏仅供学习和作为交流资料使用(Stop)(WhatshouldIdo?)例えば不満を

08-12 06:56:15

海南上半年新增减税降费及退税缓费82.6亿元

记者今日从国家税务总局海南省税务局获悉,今年上半年,海南新增减税降

08-12 05:48:56

世联行(002285):8月11日北向资金减持183.72万股

8月11日北向资金减持183 72万股世联行。近5个交易日中,获北向资金增持

08-12 04:03:32

大本钟视频 大本钟

0471房产来为大家解答以上的问题。大本钟视频,大本钟这个很多人还不知

08-12 00:55:23

中国已成全球生育率最低的国家之一 这意味着什么?

10日,中国人口学会副会长原新引相关数据指出,2022年,中国总和生育率

08-11 22:57:23

“立秋”后该如何养生? 请收下这份养生指南

华声在线·新湖南客户端8月10日讯(记者邹伟瑜)皮肤干燥、掉发、口唇干

08-11 21:44:10

新世纪医疗(01518)发盈喜 预期上半年公司拥有人应占溢利约1500万-2500万元 同比扭亏为盈

来源:智通财经新世纪医疗(01518)公布,该公司预期于2023年上半年取得

08-11 21:11:45

中国交通通信信息中心党委委员、副主任林榕:依靠战略、价值、数据、技术及创新能力 驱动交通运输行业数字化转型

8月11日,由《证券日报》社主办,中国上市公司协会指导,中关村数字产

08-11 20:26:31

三峡新材:股东拟减持不超1%公司股份

三峡新材(600293)8月11日晚间公告,持股7 14%的股东深圳市前海佳浩投资

08-11 19:33:49

两部门预拨14.6亿支持京津冀黑吉5省(市)防汛救灾工作

加上此前已预拨资金,入汛以来,中央财政已下达各项防汛救灾资金77 38

08-11 18:57:06

人民银行:7月末社融存量为365.77万亿元 同比增长8.9%

8月11日,人民银行发布2023年7月社会融资规模存量统计数据报告。初步统

08-11 18:18:27

2023放牛坪梨北京专场推介暨渝北区特色农产品展销会今日举行

渝悦好山水,魅“梨”放牛坪。8月11日,2023放牛坪梨北京专场推介暨渝

08-11 17:54:32

全国生态日,岳阳市河长办发出“致河长的一封信”

红网时刻岳阳8月11日讯(通讯员夏宇杨孝午)为开展好“8·15”首个全国

08-11 17:19:48

焦郑黄河大桥开展项目竣工档案专项验收工作

8月9日,由省档案馆副馆长翟霣远、省交通运输厅办公室副主任王明国组成

08-11 16:53:13

上半年机械工业增加值同比增长9.7%(新数据 新看点)

数据来源:中国机械工业联合会制图:蔡华伟人民日报北京8月10日电(记

08-11 16:46:22

曾经的歌系列纯音乐女声只有一个ruan(曾经的歌系列)

导读1、是QQ音乐里的《曾经的歌系列》吧?目前只出到曾经的歌系列25。2

08-11 16:02:43

智库报告:多措并举激发县域数字经济发展潜力

新华财经北京8月11日电中经智库今日发布智库报告《数字经济赋能县域经

08-11 15:44:30

量化挺进公募, 中小盘指数增强基金成兵家必争之地

记者杜萌今年以来市场持续震荡,跟踪中小盘指数的增强型基金悄然成为“

08-11 15:05:32

机械制图-形位公差详解

开拔网 直通车非标机械图纸 模型下载

08-11 14:26:48

贫困补助申请表怎么写(贫困申请表怎么写)

我是小前,我来为大家解答以上问题。贫困补助申请表怎么写,贫困申请表

08-11 13:54:23

国际最新研究发现已知最小龙王鲸化石 距今约4100万年已灭绝

中新网北京8月11日电(记者孙自法)施普林格·自然旗下专业学术期刊《通

08-11 12:54:16

借刀杀人!《OW2》玩家跑去《三国杀》求互刷差评

今天,《守望先锋2》正式登陆Steam平台,现已为“多半差评”,但玩家们

08-11 12:26:08

防汛救灾进行时 | 五常 抢排稻田内涝保收成

黑龙江日报讯(张劼记者韩波)随着受灾地区洪水逐渐消退,转移群众陆续

08-11 11:53:06

消防中级证书有什么用 消防中级证书

0471房产来为大家解答以上的问题。消防中级证书有什么用,消防中级证书

08-11 10:59:50

2023癸卯年150克方形金币价格(2023年08月11日)

金投网提供2023癸卯年150克方形金币价格(2023年08月11日),癸卯年150

08-11 10:59:27

贺绍俊:用典的小说

一连读了王子健的好几篇小说,我被一名〇〇后作家在审美上的自信和娴熟

08-11 10:22:14

个人人身意外险一般多少钱?怎么买?

个人人身意外险的价格因保险公司、保险期限、保额等因素而有所不同。一

08-11 10:10:40

长城哈弗H5上市 99元预定 12万元起售

长城哈弗近日宣布,全新一代哈弗H5已全面开启预定,预定权益为99元,可

08-11 09:53:51

天柱山到合肥的火车怎么没了_天柱山到合肥的火车

1、1、一天时间很紧啊!!最起码2天啦!!天柱山在潜山县,你肯定要做

08-11 08:56:05

银行行长的信贷“小月”:营销忙、竞争强、压力大

犀牛之星是国内专业的新三板互联网信息服务平台,提供新三板和北交所股

08-11 08:51:01

中高端占比持续扩大!广汽传祺7月销量公布

“月考成绩出炉”,广汽传祺公布了自家在7月份的销量数据。数据显示,

08-11 07:56:34

一线直击|武警河北总队官兵持续奋战在抢险救援一线

来源:人民网-河北频道原创稿人民网石家庄8月10日电8月5日起,随着河

08-11 06:53:19

大冶市税务局:税宣进商圈,助添小微新活力

大冶市税务局:税宣进商圈,助添小微新活力---为切实优化营商环境,鼓

08-11 06:04:15

炸了!美国7月CPI同比上升3.2%,明天A股怎么走?
内蒙古自治区包头市2023-08-11 00:19发布雷电黄色预警
理想汽车连续两个月交付量突破三万,产能限销量攀升
宜华木业股票 谁知道宜华木业的股票分析情况?
谷神星一号运载火箭搭载西光壹号01星等七颗卫星顺利升空
一封手写感谢信!
四十而已 起飞鄂州丨鄂州市第一所希望小学由台胞捐建
广东省江门市2023-08-10 17:52发布暴雨黄色预警
类魂游戏《堕落之主》IGN前瞻视频 行走于生死领域
工行衡东支行“整村授信”“贷”动乡村
美国信用卡债务突破1万亿美元 美媒:持续加息令消费者债务攀升
港股异动 | 友邦保险(01299)尾盘涨超3% 负债端需求持续激活 投资端有望凸显弹性
海贼王1090话情报:炸裂,小女帝爱上路飞,战桃丸激战黄猿
​连续参加19届文博会 大芬油画村推动产业升级
山东部分民企走访见闻:投资有信心 创新有恒心 转型有决心
近十年国家临床重点专科建设项目达到2200多个
某房地产集团搭建员工培训体系项目成功案例纪实
夏日清凉神器!SkyGenius桌面静音风扇仅售13元
15万辆新能源物流车!10GWh!宁德时代动力电池又迎大客户
苹果将Vision Pro头显的外接电池称为“Magic Battery”
飞凯材料:8月9日融券卖出1400股,融资融券余额7.89亿元
上海电力(600021):8月10日技术指标出现观望信号-“黑三兵”
“卖惨式”直播带货被判赔是一记响亮的法律警钟
12355防汛抗灾心理专线开通 为受灾青少年及家长提供心理疏导
沙特阿拉伯修订膳食补充剂分类注册规定
爱国拥军模范街道创建中,杨浦这些街道各有特色→
华北制药:8月9日融资买入167.18万元,融资融券余额2.24亿元
迪士尼第三财季营收223.3亿美元 Disney+订阅用户数低于预期
开胯的好处和坏处 开胯
火龙果大量上市 1元1个平靓正 预计中秋节前后价格会逐渐回升
7月物价运行整体稳定 内需正稳步回升
淘宝运营策略及技巧(淘宝运营策略)
天津做包皮手术选九洲
割包皮哪家医院强
睢宁米线哪家好吃?
山东移动聊城分公司护航九州洼水花电音节通信保障
混沌与秩序对决电脑版(混沌与秩序对决修改)
关于防溺水的自救方法有哪些 防溺水自救常识
上汽大众新能源电动车id.4x怎么样?综合优惠至高42,000元
已致7人遇难!一网红景点突然涨水,多人拍照打卡时被冲走
南昌严厉打击违规领取失业保险待遇行为
交一千抵一万!奇瑞瑞虎8新能源冠军版售价13.79万起
盛剑环境(603324)8月9日主力资金净卖出150.51万元
重磅!巴西预计2024年底推出德雷克斯数字货币【附全球数字货币行业分析】
从容 有度 蔚来郑州开启全新ES8专属试驾
游戏耳机按键功能
原油、白糖受到资金关注——品种异动2023.08.09
今年首个油价“四连涨”要来了
池州东至县开工30个项目,总投资105.8亿元
交通运输部:全国已有5931个高速公路服务区覆盖充电桩
x 广告
x 广告

Copyright ©  2015-2022 华中纤维网版权所有  备案号:京ICP备12018864号-26   联系邮箱:2 913 236 @qq.com