Go语言中的反射怎么用
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述在程序运行期对程序动态的进行访问和修改reflect godoc: https://go
千家信息网最后更新 2026年11月03日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安全错误
数据库的锁怎样保障安全
互联网加科技
互联网科技活动banner
互联网与科技金融数据
重庆互联网络科技
美国互联网科技
宜安科技 互联网金融
互联网金融科技平台
深圳天众互联网科技公司
互联网科技小额贷款
互联网科技的未来发展
居家互联网科技有限公司
佩信高科技互联网
互联网科技产品
互联网还是高科技吗
深圳育鹏互联网科技有限公司招聘
本届互联网博览会上的黑科技
华夏恒生科技与互联网科技
互联网金融科技公司的优势
富国互联网金融科技混合基金
山东蛋芒互联网科技有限公司
互联网科技图片
互联网科技开发公司
互联网金融与金融科技
互联网金融 金融科技
广州凡科互联网科技
顺网科技2021年互联网排名
温州喔噻互联网科技有限公司
语蝶互联网科技有限公司
开一家科技互联网公司需要多少钱
陕西九四连强互联网科技有限公司