zoukankan      html  css  js  c++  java
  • 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)
        }
    }
  • 相关阅读:
    防止SQL注入攻击的注意事项【转载】
    javascript小技巧之一【获取各种尺寸】
    Web.config中maxRequestLength后面数字的单位问题
    javascript小技巧之二【对象、元素、事件】
    我的博客
    初学测试用例
    初识我的博客
    自动生成小学四则运算题目
    【Yii】数据库读写方法:AR模型和DAO方法
    【阅读】看懂财经新闻的第一本书
  • 原文地址:https://www.cnblogs.com/chenny7/p/7885055.html
Copyright © 2011-2022 走看看