【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
标签:
上一篇 : 怎么清除电脑缓存?这有妙招!
下一篇 : 最后一页
据尼日利亚媒体报道,发生坍塌的清真寺是当地知名的历史建筑,始建于19
08-13 06:43:47
来为大家解答以上的问题。excel忘记密码怎么解开,excel忘记密码怎么打
08-13 05:04:21
1、庀 读音:[pǐ]部首:广五笔:YXV释义:1 治理:“内朝,子将~季氏之
08-13 01:08:42
新华社北京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国服泳装七期活动一池的四星从者为剑阶加雷斯,这里为大家介绍一下
08-12 17:38:05
8月12日电,受台风“卡努”北上影响,国铁哈尔滨局客运、货运线路防洪
08-12 16:25:31
俄罗斯媒体12日援引俄国防部发布的消息报道说,当地时间12日凌晨,俄军
08-12 14:57:33
新华社北京8月12日电题:7月产销同比增长超三成,新能源汽车延续良好发
08-12 13:53:33
8月10日,以“热爱,让收获更多”为主题的2023快手光合创作者大会在上
08-12 12:50:36
上海中西医结合医院整形美容科上海中西医结合医院是一所特色鲜明的三级
08-12 11:40:12
据游戏推主JamieMoran报道,猫猫游戏《流浪》登顶Xbox英国地区付费游戏榜。
08-12 10:48:19
一、江苏省徐州市天气预报1、丰县气象台2023年08月12日09时43分继续发
08-12 10:05:19
河北计划两年完成灾后重建
08-12 09:19:34
截至2023年8月11日收盘,微电生理(688351)报收于16 03元,上涨0 19%,
08-12 08:23:19
本专栏仅供学习和作为交流资料使用(Stop)(WhatshouldIdo?)例えば不満を
08-12 06:56:15
记者今日从国家税务总局海南省税务局获悉,今年上半年,海南新增减税降
08-12 05:48:56
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)公布,该公司预期于2023年上半年取得
08-11 21:11:45
8月11日,由《证券日报》社主办,中国上市公司协会指导,中关村数字产
08-11 20:26:31
三峡新材(600293)8月11日晚间公告,持股7 14%的股东深圳市前海佳浩投资
08-11 19:33:49
加上此前已预拨资金,入汛以来,中央财政已下达各项防汛救灾资金77 38
08-11 18:57:06
8月11日,人民银行发布2023年7月社会融资规模存量统计数据报告。初步统
08-11 18:18:27
渝悦好山水,魅“梨”放牛坪。8月11日,2023放牛坪梨北京专场推介暨渝
08-11 17:54:32
红网时刻岳阳8月11日讯(通讯员夏宇杨孝午)为开展好“8·15”首个全国
08-11 17:19:48
8月9日,由省档案馆副馆长翟霣远、省交通运输厅办公室副主任王明国组成
08-11 16:53:13
数据来源:中国机械工业联合会制图:蔡华伟人民日报北京8月10日电(记
08-11 16:46:22
导读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
中新网北京8月11日电(记者孙自法)施普林格·自然旗下专业学术期刊《通
08-11 12:54:16
今天,《守望先锋2》正式登陆Steam平台,现已为“多半差评”,但玩家们
08-11 12:26:08
黑龙江日报讯(张劼记者韩波)随着受灾地区洪水逐渐消退,转移群众陆续
08-11 11:53:06
0471房产来为大家解答以上的问题。消防中级证书有什么用,消防中级证书
08-11 10:59:50
金投网提供2023癸卯年150克方形金币价格(2023年08月11日),癸卯年150
08-11 10:59:27
一连读了王子健的好几篇小说,我被一名〇〇后作家在审美上的自信和娴熟
08-11 10:22:14
个人人身意外险的价格因保险公司、保险期限、保额等因素而有所不同。一
08-11 10:10:40
长城哈弗近日宣布,全新一代哈弗H5已全面开启预定,预定权益为99元,可
08-11 09:53:51
1、1、一天时间很紧啊!!最起码2天啦!!天柱山在潜山县,你肯定要做
08-11 08:56:05
犀牛之星是国内专业的新三板互联网信息服务平台,提供新三板和北交所股
08-11 08:51:01
“月考成绩出炉”,广汽传祺公布了自家在7月份的销量数据。数据显示,
08-11 07:56:34
来源:人民网-河北频道原创稿人民网石家庄8月10日电8月5日起,随着河
08-11 06:53:19
大冶市税务局:税宣进商圈,助添小微新活力---为切实优化营商环境,鼓
08-11 06:04:15
据尼日利亚媒体报道,发生坍塌的清真寺是当地知名的历史建筑,始建于19
2023-08-13
来为大家解答以上的问题。excel忘记密码怎么解开,excel忘记密码怎么打
2023-08-13
1、庀 读音:[pǐ]部首:广五笔:YXV释义:1 治理:“内朝,子将~季氏之
2023-08-13
新华社北京8月12日电(记者吴雨、李延霞)记者12日从国家金融监督管理
2023-08-12
据李俊介绍,创立以来,盛健羊乳一直在坚持“养好羊,做好奶”的原则,
2023-08-12
7月7日,中国消费者协会、中国保健协会化妆品发展工作委员会联合发布暑期消费指示,保障儿童用妆安全。...
概念特点1、 定义:纤维是天然或人工合成的细丝状物质,纺织纤维则是指用来纺织布的纤维。2、 纺织纤...
中新网西宁11月21日电 题:青海水润高原:从“大动脉”到“毛细血管”的精准管理 作者 谈林明...
中新网西宁11月21日电 (记者 张添福)青海省卫生健康委员会21日消息,该省第3例本土确诊病例经过20...
新华社华盛顿11月20日电 通讯:“留在中国的决定让我拥有一段值得讲述的人生”——留华美国学生韩...
上市公司频获机构调研 接待机构来访量为20.89万家
Copyright © 2015-2022 华中纤维网版权所有 备案号:京ICP备12018864号-26 联系邮箱:2 913 236 @qq.com