当前位置: 首页 > article >正文

golang反射

https://www.bilibili.com/video/BV1gf4y1r79E?p=23

reflect包

  1. 反射的作用:在运行时检查数据的类型和值
  2. 核心函数
    • reflect.TypeOf:获取一个值的类型
    • reflect.ValueOf:获取它的值
    • reflect.New:创建一个指向该类型的新指针。也就是说,为传入的类型分配内存,并返回一个指向该内存的指针的反射值。
  3. 读取结构体字段,field就是成员变量
type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func inspectStruct(u User) {
    t := reflect.TypeOf(u)
    v := reflect.ValueOf(u)
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i).Interface()  // 成员变量的值
        fmt.Printf("Field: %s, Tag: %s\n", field.Name, field.Tag.Get("json"))
    }
}
  1. 动态调用函数
func Add(a, b int) int {
    return a + b
}

func main() {
    funcValue := reflect.ValueOf(Add)
    args := []reflect.Value{reflect.ValueOf(3), reflect.ValueOf(4)}
    results := funcValue.Call(args)
    fmt.Println(results[0].Int()) // 输出: 7
}
  1. 修改值
func modifyValue(x interface{}) {
    v := reflect.ValueOf(x)
    // Elem()是获取指针指向的值,CanSet方法则检查该Value是否可以被修改
    if v.Kind() == reflect.Ptr && v.Elem().CanSet() {
        v.Elem().SetInt(100)
    }
}

func main() {
    var x int = 42
    modifyValue(&x)
    fmt.Println(x) // 输出: 100
}

反射用处

  1. ​通用库开发:如 JSON 序列化/反序列化(encoding/json)、ORM 框架等。
  2. ​动态类型处理:需要根据类型名称或字段动态处理数据。
  3. ​插件化系统:动态加载模块并调用方法。
  4. ​测试工具:自动化测试中动态调用函数。

http://www.kler.cn/a/573822.html

相关文章:

  • 【构建企业级Spring Boot应用:从基础到高级的全面指南】
  • 【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
  • 第二十六天:Scrapy 框架-下载中间件Middleware
  • maven高级-03.继承与聚合-版本锁定
  • 什么是安全组及其作用?
  • DeepSeek 开源周回顾「GitHub 热点速览」
  • 大数据技术基于聚类分析的消费者细分与推荐系统
  • C#+Halcon 检测稳定性提升的方式
  • MySQL增量更新数据:高效同步策略与PanguSync实战指南
  • Flink的市场竞争力:大数据浪潮中的“潜力股”还是“青铜”?
  • springboot宠物服务系统-计算机毕业设计源码29146
  • Vue.js 监听属性
  • C/C++中如何通过函数指针调用其他dll模块封装的函数,调用时,如果参数不匹配,会出现什么哪些错误?
  • Java 大视界 -- Java 大数据在智慧文旅游客流量预测与景区运营优化中的应用(110)
  • 扣子(Coze):重构AI时代的工作流革命
  • vue全局注册组件
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例3: 行选择
  • 最好用的多语言插件Google Language Translator
  • 景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁
  • 关于大型语言模型的结构修剪