• go学习笔记-反射(Reflection)


    反射(Reflection)

    反射是利用reflect包实现的

    • 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地
    • 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息
    • 反射会将匿名字段作为独立字段(匿名字段本质)
    • 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface
    • 通过反射可以“动态”调用方法

    基本操作

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type User struct {
        Id   int
        Name string
        Age  int
    }
    
    func (u User) Hello() {
        fmt.Println("Hello world!")
    }
    func Info(o interface{}) {
        t := reflect.TypeOf(o)         //反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息
        fmt.Println("Type:", t.Name()) //调用t.Name方法来获取这个类型的名称
    
        v := reflect.ValueOf(o) //打印出所包含的字段
        fmt.Println("Fields:")
        for i := 0; i < t.NumField(); i++ { //通过索引来取得它的所有字段,这里通过t.NumField来获取它多拥有的字段数量,同时来决定循环的次数
            f := t.Field(i)               //通过这个i作为它的索引,从0开始来取得它的字段
            val := v.Field(i).Interface() //通过interface方法来取出这个字段所对应的值
            fmt.Printf("%6s:%v =%v
    ", f.Name, f.Type, val)
        }
        for i := 0; i < t.NumMethod(); i++ { //这里同样通过t.NumMethod来获取它拥有的方法的数量,来决定循环的次数
            m := t.Method(i)
            fmt.Printf("%6s:%v
    ", m.Name, m.Type)
    
        }
    }
    func main() {
        u := User{1, "Jack", 23}
        Info(u)
    }
    

    动态调用方法

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type User struct {
        Id   int
        Name string
        Age  int
    }
    
    func (u User) Hello(name string) {
        fmt.Println("Hello", name, "My name is", u.Name)
    }
    
    func main() {
        u := User{1, "OK", 12}
        v := reflect.ValueOf(u)
        mv := v.MethodByName("Hello")
        args := []reflect.Value{reflect.ValueOf("JOE")}
        mv.Call(args)
    }
    
  • 相关阅读:
    洛谷 P2480 [SDOI2010]古代猪文
    [六省联考2017]组合数问题
    数据结构--左偏树(可并堆)
    图论--tarjan求割点
    图论--tarjan缩点
    图论--DFS-SPFA求负环
    图论--tarjan求lca
    洛谷 P2163 [SHOI2007]Tree 园丁的烦恼
    数据结构--主席树(不带修改)
    洛谷 P1712 区间
  • 原文地址:https://www.cnblogs.com/SLchuck/p/9936936.html
Copyright © 2020-2023  润新知