zoukankan      html  css  js  c++  java
  • GO语言反射

    反射可以作为了解,不必深入!

    反射介绍

    Go语音提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。
    Go程序在运行期使用reflect包访问程序的反射信息。

    reflect包

    反射是由 reflect 包提供支持. 它定义了两个重要的类型, Type 和 Value.任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。

    TypeOf

    reflect.TypeOf()函数可以获得任意值的类型对象(reflect.Type)。

    func reflectTYpe(x interface{})  {
        v := reflect.TypeOf(x)
        fmt.Printf("type:%v
    ",v)
    }
    
    func main() {
        var a int = 10
        reflectTYpe(a)  //type:int
        var b float32 = 1.1
        reflectTYpe(b)  //type:float32
        var c bool = false
        reflectTYpe(c)  //type:bool
    }
    

    type name和type kind

    在反射中关于类型还划分为两种:类型(Type)和种类(Kind)。种类(Kind)就是指底层的类型.

    type myInt int64
    
    func reflectType(x interface{})  {
        t := reflect.TypeOf(x)
        fmt.Printf("type:%v kind:%v
    ",t.Name(),t.Kind())
    }
    
    func main()  {
        var a int64
        var b *float32
        var c myInt
        var d rune
        reflectType(a)  //type:int64 kind:int64
        reflectType(b)  //type: kind:ptr
        reflectType(c)  //type:myInt kind:int64
        reflectType(d)  //type:int32 kind:int32
    
        type stu struct {
            name string
            id int64
            age int64
        }
        type person struct {
            do string
        }
        var e = stu{
            name:"ares",
            id:1,
            age:18,
        }
        var f = person{
            do:"study go",
        }
        reflectType(e)  //type:stu kind:struct
        reflectType(f)  //type:person kind:struct
    

    Go语言的反射中像数组、切片、Map、指针等类型的变量,它们的.Name()都是返回空。
    在reflect包中定义的Kind类型如下:

    type Kind uint
    const (
        Invalid Kind = iota  // 非法类型
        Bool                 // 布尔型
        Int                  // 有符号整型
        Int8                 // 有符号8位整型
        Int16                // 有符号16位整型
        Int32                // 有符号32位整型
        Int64                // 有符号64位整型
        Uint                 // 无符号整型
        Uint8                // 无符号8位整型
        Uint16               // 无符号16位整型
        Uint32               // 无符号32位整型
        Uint64               // 无符号64位整型
        Uintptr              // 指针
        Float32              // 单精度浮点数
        Float64              // 双精度浮点数
        Complex64            // 64位复数类型
        Complex128           // 128位复数类型
        Array                // 数组
        Chan                 // 通道
        Func                 // 函数
        Interface            // 接口
        Map                  // 映射
        Ptr                  // 指针
        Slice                // 切片
        String               // 字符串
        Struct               // 结构体
        UnsafePointer        // 底层指针
    )
    
  • 相关阅读:
    IDEA远程仓库版本回滚
    智能风控平台核心之风控决策引擎(三)
    智能风控平台核心之风控决策引擎(一)
    深入理解Oracle的imp/exp 和各版本之间的规则
    oracle忘记用户密码
    Windows下使用cmd启动Oracle EM和sql命令使用+主机身份认证
    jsp调用javabean出现错误HTTP Status 500
    jsp查询页面和结果页面在同一页面显示和交互
    javabean+servlet+jsp程序_个人辛苦探索
    用Eclipse 开发Dynamic Web Project应用程序 【转】
  • 原文地址:https://www.cnblogs.com/aresxin/p/GO-yu-yan-fan-she.html
Copyright © 2011-2022 走看看