美文网首页
Go笔记-Chap10 反射

Go笔记-Chap10 反射

作者: leon4ever | 来源:发表于2019-05-10 15:34 被阅读0次

    10.1 类型

    反射让我们能在运行期探知对象的类型信息和内存结构,从而弥补静态语言在动态行为上的不足。反射还是实现元编程的重要手段。

    func TypeOf(i interface{}) Type
    func ValueOf(i interface{}) Value
    

    方法Elem返回指针、数组、切片、字典或通道的基类型

    • 获取结构体指针的基类型后,遍历字段
    • 对于匿名字段,用多级索引(按定义顺序)直接访问

    10.2 值

    Value专注于对象实例数据读写
    接口遍历会复制对象,而且unaddressable,所以想修改,要用指针。

    func main() {
        a := 100
        va, vp := reflect.ValueOf(a), reflect.ValueOf(&a).Elem()
        fmt.Println(va.CanAddr(), va.CanSet())
        fmt.Println(vp.CanAddr(), vp.CanSet())
    }
    

    输出

    false false
    true true
    

    就算传入指针,也要通过Elem获取目标对象,因为被接口存储的指针本身不能寻址和进行设置操作

    对非导出字段,不能直接进行设置操作

    可通过Interface方法进行类型推断和转换
    接口有两种nil状态,用IsNil判断值是否为nil

    10.3 方法

    动态调用方法,按In列表准备好所需参数。

    10.4 构建

    反射库提供了内置函数make和new的对应操作,MakeFunc可用来实现通用模板,适应不同数据类型。

    相关文章

      网友评论

          本文标题:Go笔记-Chap10 反射

          本文链接:https://www.haomeiwen.com/subject/eweaoqtx.html