• GoLang之反射


    反射


    反射(reflect)

    所谓反射(reflect)就是能检查程序在运行时的状态。

    使用反射的三条定律:

    1. 反射可以将“接口类型变量”转换为“反射类型对象”;
    2. 反射可以将“反射类型对象”转换为“接口类型变量”;
    3. 如果要修改“反射类型对象”,其值必须是“可写的”;

    使用reflect一般分成三步:

    1、要去反射是一个类型的值(这些值都实现了空接口),首先需要把它转化成reflect对象(reflect.Type 或 reflect.Value):

    func TypeOf(i iterface{}) Type     // 返回接口中保存的值的类型,TypeOf(nil)会返回nil。
    func ValueOf(i iterface{}) Value   // 返回一个初始化为i接口保管的具体值的Value,ValueOf(nil)返回Value零值。

    2、将reflect对象转化成相应的值,例如:

    tag := t.Elem().Field(0).Tag        // 获取定义在struct里面的标签
    name := v.Elem().Field(0).String()  // 获取存储在第一个字段里面的值

    3、获取反射值能返回相应的类型和数值

    var x float64 = 3.4
    v := reflect.ValueOf(x)
    fmt.Println("type:", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())

    最后,反射的话,那么反射的字段必须是可修改的。反射的字段必须是可读写的意思是,如果下面这样写,那么会发生错误

    var x float64 = 3.4
    v := reflect.ValueOf(x)
    v.SetFloat(7.1)

    如果要修改相应的值,必须这样写

    var x float64 = 3.4
    p := reflect.ValueOf(&x)
    v := p.Elem()
    v.SetFloat(7.1)

    struct tag

    先看一个例子,如何获取struct tag:

    type User struct {
        Name   string `user_name`
        Age int `age`
    }
    
    func (this *User) AddAge() {
        this.Age += 1
    }
    
    func main() {
        user := &User{"John", 18}
        t := reflect.TypeOf(user)
        s := t.Elem()
        for i := 0; i < s.NumField(); i++ {
            fmt.Println(s.Field(i).Tag)
        }
    }
  • 相关阅读:
    Java遍历JsonObject对象
    fastjson.JSONObject之对象与JSON转换方法
    Java HotSpot VM中的JIT编译
    JAVA 反射类 捕获异常 method.invoke方法如何捕获异常
    手动调用hibernate的参数校验器和springboot参数校验器 验证
    Netty-Socketio API
    Netty-socketio集成redis,服务端集群推送消息
    mysql 导出csv格式数据解决乱码
    自建dns服务器
    MySQL 8.0 克隆(clone)插件快速搭建主从复制
  • 原文地址:https://www.cnblogs.com/chenny7/p/7885055.html
Copyright © 2020-2023  润新知