• reflect——go反射三大定律


    反射三大定律

    反射第一定律:反射可以将“接口类型变量”转换为“反射类型对象”

    1.使用v := reflect.TypeOf(a),对基本类型进行反射处理,因为TypeOf函数原型为:func TypeOf(I interface{})Type;故符合第一条定律

    2.reflect.ValueOf().Type也可以返回一个reflect.Type类型的对象

    3.reflect.ValueOf()获得到的对象,调用Kind函数会返回底层数据类型

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type myInt int
    
    func main() {
        var a myInt
        var b int
        v1 := reflect.ValueOf(a)
        v2 := reflect.ValueOf(b)
        fmt.Printf("v1 base type:%v
    ", v1.Kind())
        fmt.Printf("v2 base type:%v
    ", v2.Kind())
    }

    反射第二定律:反射可以将“反射类型对象”转换为“接口类型变量”

    1.转换原型:func (v Value)interface() interface{},使用该函数可以将一个反射类型变量转换为我们想要的类型变量

    func main() {
    
        str := "123"
        fmt.Printf("str type:%T
    ", str)
        v3 := reflect.ValueOf(str)
        fmt.Printf("v3 type:%v  v3 value:%v v3 kind:%v
    ", v3.Type(), v3, v3.Kind())
        tempstr := v3.Interface()
        fmt.Printf("tempstr value:%s  tempstr type:%T
    ", tempstr, tempstr)
    }

    反射第三定律:如果要修改“反射类型对象”其值必须是“可写的”

    1.规定反射类型对象值是否可以修改在于该变量是否具有访问源变量地址的能力。即v := reflect.ValueOf(&p),传入地址,然后解引用,对变量进行赋值

    2.判断对象值是否可以修改函数:v.CanSet()

    func main() {
    
        var x float64 = 3.4
    
        p := reflect.ValueOf(&x) // Note: take the address of x.
    
        v := p.Elem()
    
        v.SetFloat(7.1)
    
        fmt.Println(“settability of v”,v.CanSet())
    
        fmt.Println(v.Interface())
    
        fmt.Println(x)
    
    }
  • 相关阅读:
    线程同步技术
    线程调用
    进程与线程
    网络配置
    vi
    文件系统
    系统管理命令
    Linux常用命令
    Shell编程
    新版chrome touch警告处理办法
  • 原文地址:https://www.cnblogs.com/single-dont/p/13550268.html
Copyright © 2020-2023  润新知