尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值
内容包括1. 用interface{}接收值2. 判断interface{}的类型 switch3. 打印interface{}的类型4. 通过字符串对结构体interface{}等进行设置值、获取值处理示例代码package main import ( fmt log reflect ) type Student2 struct { Id1 int json:jsonTag1 db:name2 Name1 string age1 int } func reflectValue(a interface{}) { log.Println( reflect value start ) // 类型判断 switch a.(type) { case float64: log.Println(a type is :, float64) case float32: log.Println(a type is :, float32) default: log.Println(a type is :, default) } // 打印类型 aType : reflect.TypeOf(a) log.Println(a type is:, aType) // 获取值 aValue : reflect.ValueOf(a) log.Println(a value is :, aValue.Float()) // 设置值报错不传指针就没办法设置值 // 报错信息panic: reflect: reflect.Value.SetFloat using unaddressable value // aValue.SetFloat(32.11) // log.Println(a value is :, aValue.Float()) log.Println( reflect value end ) } func reflectPoint(a interface{}) { log.Println( reflect point start ) // 打印类型 aType : reflect.TypeOf(a) log.Println(a type is:, aType) // 判断类型 aKind : aType.Kind() switch aKind { case reflect.Float64: log.Println(a kind is :, float64) case reflect.Float32: log.Println(a kind is :, float32) case reflect.Pointer: log.Println(a kind is :, Pointer) } // 获取参数 aValue : reflect.ValueOf(a) log.Println(a value is :, aValue.Elem().Float()) // 设置参数 aValue.Elem().SetFloat(32.1) log.Println(a value is :, aValue.Elem().Float()) log.Println( reflect point end ) } func reflectStructValue(a interface{}) { log.Println( reflect struct value start ) // 获取类型 aType : reflect.TypeOf(a) log.Println(a type of :, aType) log.Println(a type name :, aType.Name()) // 获取值{100 name1 13} aValue : reflect.ValueOf(a) log.Println(a value of :, aValue) // 根据名称获取字段 // 如果外边传的是value则没法赋值如果传的是$stu地址 则可以复制 name1Filed : aValue.FieldByName(Name1) if name1Filed.Kind() reflect.String name1Filed.CanSet() { name1Filed.SetString(name1111111111) } // 遍历属性 fieldNum : aType.NumField() for i : 0; i fieldNum; i { field : aType.Field(i) value : aValue.Field(i) // 这里得看属性是否大小写如果小写没法子获取他的值 // panic: reflect.Value.Interface: cannot return value obtained from unexported field or method // 获取字段标记field.Tag.Get(json) if value.CanInterface() { log.Println(属性, field.Name, field.Type, value.Interface(), field.Tag.Get(json)) } else { log.Println(属性, field.Name, field.Type) } } // 遍历方法 // func (stu Student2) Say() 可以获取到 // func (stu *Student2) Say() aType.NumMethod就没法获取到了 methodNum : aType.NumMethod() for i : 0; i methodNum; i { method : aType.Method(i) log.Println(方法, method.Name, method.Type) } // 根据名称获取方法并执行 sayMethod : aValue.MethodByName(Say) args : []reflect.Value{reflect.ValueOf(message1111)} sayMethod.Call(args) log.Println( reflect struct value end ) } func reflectStructPoint(a interface{}) { log.Println( reflect struct point start ) // 获取值{100 name1 13} aValue : reflect.ValueOf(a) log.Println(a value of :, aValue.Elem().Interface()) // 根据名称获取字段 // 如果外边传的是value则没法赋值如果传的是$stu地址 则可以复制 name1Filed : aValue.Elem().FieldByName(Name1) if name1Filed.Kind() reflect.String name1Filed.CanSet() { name1Filed.SetString(name1111111111) } log.Println(a value of :, a) log.Println(a value of :, aValue.Elem().Interface()) log.Println( reflect struct point start ) } func (stu Student2) Say(message string) { log.Println(student say:, stu, message) } func main() { log.Println(main ...) var f float64 10 // 传地址可以修改 reflectPoint(f) // 传值就不能修改 reflectValue(f) stu : Student2{100, name1, 13} stu.Say(1111) reflectStructValue(stu) reflectStructPoint(stu) fmt.Println(success ...) }参考https://www.topgoer.com/%E5%B8%B8%E7%94%A8%E6%A0%87%E5%87%86%E5%BA%93/%E5%8F%8D%E5%B0%84.html
RELATED

相关推荐

闲鱼自动化监控系统:3分钟快速部署,实现24小时智能商品抓取

闲鱼自动化监控系统:3分钟快速部署,实现24小时智能商品抓取

闲鱼自动化监控系统:3分钟快速部署,实现24小时智能商品抓取 【免费下载链接】idlefish_xianyu_spider-crawler-sender 闲鱼自动抓取/筛选/发送系统,xianyu spider crawler blablabla 项目地址: https://gitcode.com/gh_mirrors/id/idlefish…

📅 2026/8/20 20:36:36
嵌入式RTOS技术简介:实时操作系统到底是什么

嵌入式RTOS技术简介:实时操作系统到底是什么

一 RTOS核心定义RTOS全称Real-Time Operating System,实时操作系统,是专门面向嵌入式设备、以任务响应确定性为核心设计的操作系统,和我们电脑/手机用的Linux、Windows分时操作系统有本质区别。通用操作系统(Linux/Android&#x…

📅 2026/8/20 20:36:36
任天堂Switch终极自定义固件:Atmosphere 1.7.1完整使用指南 [特殊字符]

任天堂Switch终极自定义固件:Atmosphere 1.7.1完整使用指南 [特殊字符]

任天堂Switch终极自定义固件:Atmosphere 1.7.1完整使用指南 🎮 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable Atmosphere 1.7.1是任天堂Switch平台上最强大、最稳定…

📅 2026/8/20 20:36:37
MORE NEWS

更多资讯

📰

常用控件的介绍(下)

0.引言 现在开始介绍的各种Qt中的控件,都是继承自QWidget,所以QWidget的属性在接下来的控件中都是可以使用的。也就是刚刚QWidget中涉及到的各种属性/函数/使用方法,针对接下来要介绍的Qt中的各种控件都是有效的,下面来学习Qt中提…

📰

高效访问全球资源:2025年学术与开发资源获取指南

高效访问全球资源:2025年学术与开发资源获取指南 你是否还在为无法稳定获取国际学术文献而烦恼?作为科研人员,是否因频繁遇到"连接超时"而错失关键研究资源?开发者面对GitHub克隆速度过慢,是否只能一次次重…

📰

如何从零开始开发一个跨境电商ERP系统?

如何从零开始开发一个跨境电商ERP系统?开发一个跨境电商ERP(企业资源规划)系统是一个复杂且需要多方面考虑的项目。简单来说,ERP系统就是帮助企业管理各种资源,比如产品、订单、库存等。跨境电商ERP还要考虑多语言、多…

📰

机器人主控选型:MCU与MPU的实时性与AI协同设计

1. 为什么机器人开发者最近总在争论“MCU还是MPU”——这不是选芯片,是在选机器人的呼吸节奏你有没有试过给一个四足机器人装上语音唤醒功能,结果发现它每次听到“嘿小智”都要卡顿半秒?或者调试SLAM建图时,激光雷达数据流稳定输出…

📰

Jujutsu 的 jj absorb 怎么把修改自动归入最近改过对应行的提交?

Jujutsu 的 jj absorb 怎么把修改自动归入最近改过对应行的提交? 【免费下载链接】jj A Git-compatible VCS that is both simple and powerful 项目地址: https://gitcode.com/GitHub_Trending/jj/jj 你刚在 Jujutsu 仓库里堆了一串提交,又在 wo…

📰

verl 在 AMD ROCm 上的容器化部署指南:Dockerfile.rocm 镜像构建、配置与训练实战

verl 在 AMD ROCm 上的容器化部署指南:Dockerfile.rocm 镜像构建、配置与训练实战 【免费下载链接】verl verl/HybridFlow: A Flexible and Efficient RL Post-Training Framework 项目地址: https://gitcode.com/GitHub_Trending/ve/verl 本指南以 docker/…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬