第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

标签:

各大股份行、城农商行纷纷跟进下调 9月25日起主动调降存量房贷利率

在六大国有大行集体宣布下调存量房贷利率的具体政策后,大多数股份行以

09-09 13:38:34

连过四人射门被扑,这个球很像内马尔职业生涯,技术顶尖但不完美

比赛中,内马尔上演了精彩过人但射门被扑出的一幕,这个球也是内马尔职

09-09 11:42:41

认怂了!临沂女子理发店亮证后续:害怕丢饭碗哭着鞠躬道歉 被拒绝

当初有多嚣张,现在就有多后悔。临沂“亮证”女子认怂了,她跑去向理发

09-09 10:08:02

住建部发布!事关光伏

9月5日,住建部办公厅发布关于工程建设强制性国家规范《太阳能发电工程

09-09 08:25:55

揭秘美团的劳动外包现象,一个公司精到这程度,不亏是清华出来的

引言:揭开美团背后的劳动外包现象,探寻其价值所在。美团作为一家精细

09-09 05:55:33

怎么用酷狗音乐来剪辑制作歌曲视频(怎么用酷狗音乐来剪辑制作歌曲)

您好,现在蔡蔡来为大家解答以上的问题。怎么用酷狗音乐来剪辑制作歌曲

09-09 00:45:21

长白山2023上半年完成公司历史最佳中报业绩 一年两旺

9月8日长白山召开中报业绩说明会,2023上半年公司实现营收亿元,同比增

09-08 21:32:41

中泰化学:公司持续通过压降库存物资、加快货物周转、降低物流成本等方式降本增效,积极应对公司亏损

中泰化学(002092)09月08日在投资者关系平台上答复了投资者关心的问题。

09-08 20:53:17

保障太差!国乒球员一天4赛,孙颖莎吃泡面,韩国自家球员吐槽

首先是比赛非常密集,国乒球员们一天3赛,甚至4赛都是常事,比如9月8日

09-08 18:41:49

医保移动支付提速扩面要有系统思维

对医保移动支付这项事关患者切身感受的工作,既要加快推进,更要坚持系

09-08 17:10:10

农业农村部:9月8日"农产品批发价格200指数"比昨天下降0.21个点

据农业农村部监测,9月8日 "农产品批发价格200指数 "为121 62,比昨天

09-08 16:22:06

晶澳科技高级副总裁孙广彬:气候变化带来新一轮公司治理变革及循环经济发展

9月7日,全球环境科学家大会暨第七次全球环境展望第二次作者研讨会主论

09-08 15:00:09

把“世界超市”义乌搬上京东 京东9.9超省日打造靠谱版“9.9包邮”

9月8日晚8点,京东“9 9超省日”即将全面开启。作为京东全新打造的

09-08 14:03:52

减产一度提振油价,但经济担忧仍挥之不去

OPEC+减产以及沙特和俄罗斯的延长减产一度推高油价至2023年90美元 桶以

09-08 12:26:12

争分夺秒抢险 持续不停救援

9月7日凌晨3时许,甘肃省甘南藏族自治州夏河县达麦乡和麻当镇发生山洪

09-08 11:20:25

《融贯东西的典范

9月6日,《融贯东西的典范——敦煌文化主题展》在甘肃敦煌开展。该展览

09-08 10:35:51

天赐材料(002709.SZ):拟对年产30万吨磷酸铁项目(二期)追加投资

格隆汇9月8日丨天赐材料002709002709SZ公布公司于2022年4月13日召开了

09-08 09:53:41

南铁继续调整列车运行方案

南铁继续调整列车运行方案-

09-01 10:27:30

阴天飞机能正常起飞吗 阴天可以起飞吗

阴天飞机能正常起飞,主要的限制因素是能见度(或跑道视程)与云底高。

09-01 09:17:57

维也纳交通博物馆:讲述150余年城市交通史

8月30日,在奥地利维也纳交通博物馆,观众模拟体验地铁列车驾驶。  

09-01 09:01:40

华夏银行资本充足率回到前年末水平 净息差下行压力仍存

8月25日,华夏银行股份有限公司(以下简称“华夏银行”,600015 SH)发

09-01 07:28:27

亚洲制造业论坛秘书长罗军:制造业由大做强需做好三方面工作

题:亚洲制造业论坛秘书长罗军:制造业由大做强需做好三方面工作

09-01 05:30:56

现在柴犬价格是多少怎么样(柴犬价格为啥居高不下

环球汽车7月消息小杨来为大家解答以上问题,现在柴犬价格是多少怎么样

09-01 00:56:12

“互学互鉴,共享发展”中国-中亚传统医学论坛在新疆乌鲁木齐举办

8月30日至31日,由新疆维吾尔自治区人民政府、国家中医药管理局共同主

08-31 21:35:48

“课前到书,人手一册”迎开学

卸货、分发、装车、配送……每年的开学季,都能看到出版、发行人忙碌的

08-31 20:08:36

利伟生物2023年上半年净利-243.05万 亏损增长62.64%

利伟生物2023年上半年净利-243 05万亏损增长62 64%2023 8 3118:38:11挖

08-31 18:32:47

保利文化(03636.HK):上半年股东应占亏损7568.4万元

格隆汇8月31日丨保利文化(03636 HK)发布公告,截至2023年6月30日止六个

08-31 17:43:02

2023西安市长安区人民检察院招聘警务辅助人员

招聘岗位警务辅助人员:6名(限男性)招聘条件1、自愿从事辅警工作,乐于

08-31 16:37:44

普安冉家四姐妹:情洒茶山绽芳华 带领乡亲奔富路

在普安县茶源街道,提起冉家四姐妹冉应欢、冉桂琴、冉琴、冉敏,人人都

08-31 15:18:32

俄罗斯举办第32届国际农业工业展

新华社圣彼得堡8月30日电(记者安晓萌)俄罗斯第32届国际农业工业展30

08-31 14:10:40

2023年中国农民丰收节吉祥物和LOGO发布

8月31日上午,2023年中国农民丰收节吉祥物和LOGO正式发布。今年中国农

08-31 12:45:33

台风“苏拉”明日或登陆广东,局地有大暴雨

今天(8月31日),今年第9号台风“苏拉”继续逼近广东沿海。受其影响,

08-31 11:14:12

本草撮要 卷五 五谷部刀豆

本草撮要>> 卷五 五谷部刀豆味甘温。入手足阳明经。功专温中下气

08-31 10:14:26

苹果笺

一我们大院里,曾经有一对夫妇,男的是一位工程师,女的是一位中学老师

08-31 09:06:11

华为云发布盘古大模型全域协同生态 实现行业共赢

8月30日,华为云盘古大模型主题论坛在北京召开,华为云宣布将全面建设

08-31 08:02:53

严重或危及生命!亚洲多国流行 海关紧急提醒

蚊媒传染病,是指由蚊子传播的自然疫源性疾病,常见的有流行性乙型脑炎

08-31 06:30:48

内嵌式冰箱插座(冰箱用多大的插座)

相信大家对内嵌式冰箱插座,冰箱用多大的插座的问题都很疑惑,这个问题

08-31 02:56:24

崔康熙:精神战术都做好准备 国安与上次交手不同

体坛加,体坛+,天谭,山东泰山,北京国安,足协杯,崔康熙:精神战术都做好

08-30 22:37:45

有关抒情富有哲理的句子,句句伤感走心!

1 你可以用一分钟遇见一个人,用一小时了解一个人,用一天爱上一个人,

08-30 20:58:17

注意了!“海粉儿之家” 新一波抽奖来啦

“海粉儿之家”成立以来,粉丝的热情一浪高过一浪,这几天后台留言不断

08-30 19:48:06

本轮足坛反腐已有14人被查

据中国新闻网消息:湖北省纪委监委网站8月30日通报,中超公司董事长刘

08-30 18:32:33

沈阳警方侦破一起特大非法经营“笑气”案件

沈阳市公安局30日发布消息称,沈阳警方近日经过缜密侦查、集中收网,破

08-30 17:13:20

锐新科技:公司的铝合金散热器可以用于光模块的散热基座,占比较低

每经AI快讯,有投资者在投资者互动平台提问:光模块的散热基座跟公司生

08-30 15:59:28

年中红包VS待解难题 吉比特 茶花股份 百润股份多少豪横底气?(下)

深度独立穿透取予有节,出入有时!作者:陈晚邻编辑:李明达风品:南辞

08-30 14:40:35

中东面面观丨从扎堆引进巨星到签约名教头 巨额资金投入能否助沙特足球走上巅峰?

近期把欧洲转会市场搅得天翻地覆的沙特人又搞出了大名堂!沙特足协当地

08-30 13:44:50

成功吸引招商引资的产业园区经验总结

产业园区招商引资是一个复杂而关键的过程。在全球经济高度竞争的环境下

08-30 12:16:25

突发!微信iOS版发布8.0.41版本更新

8月29日,微信正式发布iOS平台的8 0 41版本更新。官方更新日志显示,此

08-30 11:06:10

北京冬奥会未来30天的三件大事:火炬传递、开幕式、赛事运行保障

在北京冬奥会迎来开幕倒计时30天之际,北京冬奥组委新闻发言人赵卫东5

08-30 09:59:34

金沃股份:融资净偿还88.53万元,融资余额2500.71万元(08-29)

金沃股份融资融券信息显示,2023年8月29日融资净偿还万元;融资余额万

08-30 08:43:59

南京熊猫08月29日获沪股通增持28.74万股

08月29日,南京熊猫获沪股通增持万股,最新持股量为万股,占公司A股总

08-30 07:39:22

俄妹COS《边缘行者》露西 短裙美腿凸显性感身材
微软承认 Win11 Build 23531 中表情符号存在 Bug
保隆科技:上半年净利约1.84亿元 同比增长194.33%
如何确定假冒注册商标案的立案标准
被欺诈签订的合同到底有义务履行吗
宝冶钢构受邀参加智能制造及高效装配化建造发展峰会
天键股份:公司出口业务占比较高 人民币适度贬值对公司业务会有正面影响
方正证券:3000点绝不会轻易失守,A股正迎来艳阳天!“长阴惊魂”是底部洗盘特征,是周二大盘上涨的原因
中新网评:指尖跃动正能量,凝聚澎湃的奋进力量
星德胜IPO:财务勾稽关系合理性存疑点、报告期多笔资金拆借巧合否
“小积分”推进环境大治理,苏州太平街道花溇村提升党建引领基层治理效能
节庆推广人气足 1-7月江苏休闲农业游客接待量同比超4成
激光专业专科学校排名前十 中国激光切割机十大排名
菌子的“诱惑”!云南一男子深夜捡菌迷路深山
高度警惕!台风“苏拉”将给福建带来严重风雨影响
青岛食品发布2023年半年报:营收和净利润实现双增长
山东科技大学: “组合拳”巧解就业难题
检察机关依法分别对何力、朱京海、陈平、李孝廉决定逮捕
外交部:中方一贯依法保障在华外国人的安全和合法权益
2-1!克洛普神换人,1亿先生主导超级逆转,10人利物浦绝杀纽卡
足球——梅西完成美职联首秀
长城风骏5故障码p101100是什么意思
承德医学院山西录取分数线 承德医学院山西招生人数多少
氛围拉满!亚运会,杭州准备好了
《求生之路2》专家-死亡都心 求生之路2死亡之旅
“大风哥”帮老乡带货 乡村“网红”直播打开农产品新销路
阵风7-8级!济南发布大风蓝色预警信号
光大证券国际伍礼贤:印花税减半中长线利好A股和港股
自贡市自流井区人民检察院打造“盐·申”品牌 把职能和服务延伸到更广领域
女子拔手指倒刺致骨髓炎住院,当事人:一直在化脓,将进行刮骨手术,专家回应:处理不当会有截肢风险
张海鸥解读李清照:文化女性的国事与人生
从特殊定制到智能本土化,跟保时捷中国总裁聊一聊
奶茶当自强
王心凌49岁生日(王心凌85-95后的青春回忆
heartbreaker权志龙(GD heartbreaker发型怎么剪啊)
涉案16亿!6个网络赌博淫秽色情表演直播间被查
信立泰的持股逻辑还在吗?
暑期出游的热度有多高?这些数据一探究竟
中教AI说丨日本称核污染水中氚浓度“达标”,就安全了?
生活中有哪些常见的公证业务?看这里
爱康科技08月25日获深股通增持92.13万股
强势!皇马自1966年后首次实现连续两个赛季联赛开局三连胜
1500元价位的家用投影仪,快乐星球O3和知麻Z1,谁更值得买?
距离开学不到一周!这5件事要提早做起来!早看早受益
触目惊心!卫星图看福岛核污染水激增
中梁控股上半年净负债率降至27.6% 实现交房逾5万套
细分市场最强,深蓝SL03焕新上市,售价14.59万-19.19万
【20230825收评】接下来的两天终于不会跌了
晒“高副处长的礼物”账号发文:已移民,账号被盗用
冷水江市简介:冷水江有什么,冷水江缺什么,冷水江将往哪里去
x 广告
x 广告

Copyright ©  2015-2022 大河纤维网版权所有  备案号:京ICP备2022022245号-75   联系邮箱:435 226 40@qq.com