Go语言中的反射怎么用
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述在程序运行期对程序动态的进行访问和修改reflect godoc: https://go
千家信息网最后更新 2025年01月20日Go语言中的反射怎么用
这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
概述
在程序运行期对程序动态的进行访问和修改
reflect godoc: https://golang.org/pkg/reflect/
reflect包有两个数据类型:
Type:数据类型 【reflect.TypeOf():是获取Type的方法】
Value:值的类型【reflect.ValueOf():是获取Value的方法】
语法
一、基本操作
获取变量类型
func TypeOf(i interface{}) Type //Type是interface{}的别名
例子
reflect.TypeOf(10) //intreflect.TypeOf(struct{ age int }{10}) //struct { age int }
获取变量的种类
reflect.TypeOf(struct{ age int }{10}).Kind() //reflect.Structreflect.ValueOf("hello word").Kind() //reflect.String
获取变量值
func ValueOf(i interface{}) Value //value是struct {}别名
例子
reflect.ValueOf("hello word") //hello wordreflect.ValueOf(struct{ age int }{10}) //{10}
二、修改目标对象
修改普通类型
str := "hello word"reflect.ValueOf(&str).Elem().SetString("张三")
修改结构体
//第一步:ValueOf():传入一个变量的地址,返回是变量的地址 Elem():返回的是变量的原始值elem:=reflect.ValueOf(&变量名).Elem()//第二步 FieldByName():传入结构体字段名称 SetString():传入你要修改的变量值elem.FieldByName("Name").SetString("李四")
//定义一个User结构体type User struct { Name string Age int}user := User{Name: "张三", Age: 10}//Elem() 获取user原始的值elem := reflect.ValueOf(&user).Elem()//FieldByName() 通过Name返回具有给定名称的结构字段 通过SetString 修改原始的值elem.FieldByName("Name").SetString("李四")elem.FieldByName("Age").SetInt(18)
三、动态调用方法
无参方法
//MethodByName():传方法名,方法名必须大小 Call():方法的形参reflect.ValueOf(变量名).MethodByName(方法名).Call([]reflect.Value{})reflect.ValueOf(变量名).MethodByName(方法名).Call(make([]reflect.Value, 0))
type User struct { Name string `json:"name" name:"张三"` Age int}func (_ User) Say() { fmt.Println("user 说话")}user := User{Name: "张三", Age: 10}reflect.ValueOf(&user).MethodByName("Say").Call([]reflect.Value{}) reflect.ValueOf(user).MethodByName("Say").Call(make([]reflect.Value, 0))
有参方法
reflect.ValueOf(变量名).MethodByName(方法名).Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)})
type User struct { Name string `json:"name" name:"张三"` Age int}func (_ User) Say() { fmt.Println("user 说话")}user := User{Name: "张三", Age: 10}reflect.ValueOf(user).MethodByName("SayContent").Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)})
总结
反射调用struct的方法必须是公有的
反射调用无参方法时必修传 nil 或者 []reflect.Value{}
示例
package mainimport ( "fmt" "reflect")func main() { //1. 获取变量类型 fmt.Println("获取变量类型") fmt.Println(reflect.TypeOf(10)) //int fmt.Println(reflect.TypeOf(10.0)) //float64 fmt.Println(reflect.TypeOf(struct{ age int }{10})) //struct { age int } fmt.Println(reflect.TypeOf(map[string]string{"a": "a"})) //map[string]string fmt.Println("") //2. 获取变量值 fmt.Println("获取变量值") fmt.Println(reflect.ValueOf("hello word")) //hello word fmt.Println(reflect.ValueOf(struct{ age int }{10})) //{10} fmt.Println(reflect.TypeOf(struct{ age int }{10}).Kind()) //struct //类型判断 if t := reflect.TypeOf(struct{ age int }{10}).Kind(); t == reflect.Struct { fmt.Println("是结构体") } else { fmt.Println("不是结构体") } //修改目标对象 str := "hello word" //普通变量修改 reflect.ValueOf(&str).Elem().SetString("张三") fmt.Println(str) //结构体变量修改 user := User{Name: "张三", Age: 10} //Elem() 获取user原始的值 elem := reflect.ValueOf(&user).Elem() //FieldByName() 通过Name返回具有给定名称的结构字段 通过SetString 修改原始的值 elem.FieldByName("Name").SetString("李四") elem.FieldByName("Age").SetInt(18) fmt.Println(user) //获取结构体的标签的值 fmt.Println(reflect.TypeOf(&user).Elem().Field(0).Tag.Get("name")) //调用无参方法 reflect.ValueOf(&user).MethodByName("Say").Call([]reflect.Value{}) reflect.ValueOf(user).MethodByName("Say").Call(make([]reflect.Value, 0)) //调用有参方法 reflect.ValueOf(user).MethodByName("SayContent").Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)}) //调用本地的方法 reflect.ValueOf(Hello).Call([]reflect.Value{}) reflect.ValueOf(Hello).Call(nil) fmt.Printf("%#v\n", reflect.TypeOf(user).Field(0))}func Hello() { fmt.Println("hello")}type Person struct { Name string}type User struct { Person // //反射会将匿名字段作为一个独立字段来处理 Name string `json:"name" name:"张三"` Age int}func (_ User) Say() { fmt.Println("user 说话")}func (_ User) SayContent(content string, a int) { fmt.Println("user", content, a)}
以上是"Go语言中的反射怎么用"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
方法
变量
结构
张三
类型
反射
原始
字段
量值
名称
李四
语言
普通
例子
内容
别名
动态
地址
对象
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
蚁淘说互联网科技
中行西安软件开发中心校招
网络安全指呢些
绍兴市网络安全
生产管理软件开发人员
零极网络技术
大学生网络安全情况调查报告
荒野乱斗服务器又崩溃
超市系统数据库安全
网络技术在日常生活中的应用
广州曜月网络技术有限公司
数据库技术 硕士科目代码
南京专业软件开发销售电话
网络技术及发展
我想看国家网络安全宣传
阿里云服务器云盾关闭
泰拉瑞亚为什么会服务器关闭
仙桃软件开发专业
西峡计算机网络技术怎么样
账号注销数据库还有数据吗
23魔方祖源数据库尚氏
网络安全的不法行为
衢州电脑软件开发需要学什么
今年是第几个国家网络安全周
网络安全先进集体和先进个人
网络技术搬砖
外国云服务器免流
软件开发公司核心技术
ao财务数据库文件采集
国家网络安全中心重庆