【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
标签:
上一篇 : 怎么清除电脑缓存?这有妙招!
下一篇 : 船舶停航、堤坝加固……各方积极应对松辽流域强降雨
在六大国有大行集体宣布下调存量房贷利率的具体政策后,大多数股份行以
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
9月8日长白山召开中报业绩说明会,2023上半年公司实现营收亿元,同比增
09-08 21:32:41
中泰化学(002092)09月08日在投资者关系平台上答复了投资者关心的问题。
09-08 20:53:17
首先是比赛非常密集,国乒球员们一天3赛,甚至4赛都是常事,比如9月8日
09-08 18:41:49
对医保移动支付这项事关患者切身感受的工作,既要加快推进,更要坚持系
09-08 17:10:10
据农业农村部监测,9月8日 "农产品批发价格200指数 "为121 62,比昨天
09-08 16:22:06
9月7日,全球环境科学家大会暨第七次全球环境展望第二次作者研讨会主论
09-08 15:00:09
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
格隆汇9月8日丨天赐材料002709002709SZ公布公司于2022年4月13日召开了
09-08 09:53:41
南铁继续调整列车运行方案-
09-01 10:27:30
阴天飞机能正常起飞,主要的限制因素是能见度(或跑道视程)与云底高。
09-01 09:17:57
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 8 3118:38:11挖
08-31 18:32:47
格隆汇8月31日丨保利文化(03636 HK)发布公告,截至2023年6月30日止六个
08-31 17:43:02
招聘岗位警务辅助人员:6名(限男性)招聘条件1、自愿从事辅警工作,乐于
08-31 16:37:44
在普安县茶源街道,提起冉家四姐妹冉应欢、冉桂琴、冉琴、冉敏,人人都
08-31 15:18:32
新华社圣彼得堡8月30日电(记者安晓萌)俄罗斯第32届国际农业工业展30
08-31 14:10:40
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
据中国新闻网消息:湖北省纪委监委网站8月30日通报,中超公司董事长刘
08-30 18:32:33
沈阳市公安局30日发布消息称,沈阳警方近日经过缜密侦查、集中收网,破
08-30 17:13:20
每经AI快讯,有投资者在投资者互动平台提问:光模块的散热基座跟公司生
08-30 15:59:28
深度独立穿透取予有节,出入有时!作者:陈晚邻编辑:李明达风品:南辞
08-30 14:40:35
近期把欧洲转会市场搅得天翻地覆的沙特人又搞出了大名堂!沙特足协当地
08-30 13:44:50
产业园区招商引资是一个复杂而关键的过程。在全球经济高度竞争的环境下
08-30 12:16:25
8月29日,微信正式发布iOS平台的8 0 41版本更新。官方更新日志显示,此
08-30 11:06:10
在北京冬奥会迎来开幕倒计时30天之际,北京冬奥组委新闻发言人赵卫东5
08-30 09:59:34
金沃股份融资融券信息显示,2023年8月29日融资净偿还万元;融资余额万
08-30 08:43:59
08月29日,南京熊猫获沪股通增持万股,最新持股量为万股,占公司A股总
08-30 07:39:22
在六大国有大行集体宣布下调存量房贷利率的具体政策后,大多数股份行以
2023-09-09
比赛中,内马尔上演了精彩过人但射门被扑出的一幕,这个球也是内马尔职
2023-09-09
当初有多嚣张,现在就有多后悔。临沂“亮证”女子认怂了,她跑去向理发
2023-09-09
9月5日,住建部办公厅发布关于工程建设强制性国家规范《太阳能发电工程
2023-09-09
引言:揭开美团背后的劳动外包现象,探寻其价值所在。美团作为一家精细
2023-09-09
7月7日,中国消费者协会、中国保健协会化妆品发展工作委员会联合发布暑期消费指示,保障儿童用妆安全。...
概念特点1、 定义:纤维是天然或人工合成的细丝状物质,纺织纤维则是指用来纺织布的纤维。2、 纺织纤...
中新网西宁11月21日电 题:青海水润高原:从“大动脉”到“毛细血管”的精准管理 作者 谈林明...
中新网西宁11月21日电 (记者 张添福)青海省卫生健康委员会21日消息,该省第3例本土确诊病例经过20...
新华社华盛顿11月20日电 通讯:“留在中国的决定让我拥有一段值得讲述的人生”——留华美国学生韩...
上市公司频获机构调研 接待机构来访量为20.89万家
Copyright © 2015-2022 大河纤维网版权所有 备案号:京ICP备2022022245号-75 联系邮箱:435 226 40@qq.com