• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    在 Go语言中通过调用 reflect.TypeOf 函数,我们可以从一个任何非接口类型的值创建一个 reflect.Type 值。reflect.Type 值表示着此非接口值的类型。通过此值,我们可以得到很多此非接口类型的信息。当然,我们也可以将一个接口值传递给一个 reflect.TypeOf 函数调用,但是此调用将返回一个表示着此接口值的动态类型的 reflect.Type 值。

    实际上,reflect.TypeOf 函数的唯一参数的类型为 interface{},reflect.TypeOf 函数将总是返回一个表示着此唯一接口参数值的动态类型的 reflect.Type 值。

    那如何得到一个表示着某个接口类型的 reflect.Type 值呢?我们必须通过下面将要介绍的一些间接途径来达到这一目的。

    类型 reflect.Type 为一个接口类型,它指定了若干方法(https://golang.google.cn/pkg/reflect/#Type)。 通过这些方法,我们能够观察到一个 reflect.Type 值所表示的 Go类型的各种信息。这些方法中的有的适用于所有种类(https://golang.google.cn/pkg/reflect/#Kind)的类型,有的只适用于一种或几种类型。通过不合适的 reflect.Type 属主值调用某个方法将在运行时产生一个恐慌。

    使用 reflect.TypeOf() 函数可以获得任意值的类型对象(reflect.Type),程序通过类型对象可以访问任意值的类型信息。下面通过例子来理解获取类型对象的过程:

    package main
    import (
        "fmt"
        "reflect"
    )
    func main() {
        var a int
        typeOfA := reflect.TypeOf(a)
        fmt.Println(typeOfA.Name(), typeOfA.Kind())
    }
    

    代码输出如下:
    int  int

    代码说明如下:

    理解反射的类型(Type)与种类(Kind)

    在使用反射时,需要首先理解类型(Type)和种类(Kind)的区别。编程中,使用最多的是类型,但在反射中,当需要区分一个大品种的类型时,就会用到种类(Kind)。例如,需要统一判断类型中的指针时,使用种类(Kind)信息就较为方便。

    1) 反射种类(Kind)的定义

    Go 程序中的类型(Type)指的是系统原生数据类型,如 int、string、bool、float32 等类型,以及使用 type 关键字定义的类型,这些类型的名称就是其类型本身的名称。例如使用 type A struct{} 定义结构体时,A 就是 struct{} 的类型。

    种类(Kind)指的是对象归属的品种,在 reflect 包中有如下定义:

    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        // 底层指针
    )
    

    Map、Slice、Chan 属于引用类型,使用起来类似于指针,但是在种类常量定义中仍然属于独立的种类,不属于 Ptr。

    type A struct{} 定义的结构体属于 Struct 种类,*A 属于 Ptr。

    2) 从类型对象中获取类型名称和种类的例子

    Go语言中的类型名称对应的反射获取方法是 reflect.Type 中的 Name() 方法,返回表示类型名称的字符串。

    类型归属的种类(Kind)使用的是 reflect.Type 中的 Kind() 方法,返回 reflect.Kind 类型的常量。

    下面的代码中会对常量和结构体进行类型信息获取。

    package main
    import (
        "fmt"
        "reflect"
    )
    // 定义一个Enum类型
    type Enum int
    const (
        Zero Enum = 0
    )
    func main() {
        // 声明一个空结构体
        type cat struct {
        }
        // 获取结构体实例的反射类型对象
        typeOfCat := reflect.TypeOf(cat{})
        // 显示反射类型对象的名称和种类
        fmt.Println(typeOfCat.Name(), typeOfCat.Kind())
        // 获取Zero常量的反射类型对象
        typeOfA := reflect.TypeOf(Zero)
        // 显示反射类型对象的名称和种类
        fmt.Println(typeOfA.Name(), typeOfA.Kind())
    }
    

    代码输出如下:
    cat struct
    Enum int

    代码说明如下:

    到此这篇关于Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息 的文章就介绍到这了,更多相关Go 反射获取类型信息 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • go语言静态库的编译和使用方法
    • Go语言-为什么返回值为接口类型,却返回结构体
    • Go语言操作数据库及其常规操作的示例代码
    • Go语言利用ssh连接服务器的方法步骤
    • 详解用Go语言实现工厂模式(Golang经典编程案例)
    • go语言实现简易比特币系统之交易签名及校验功能
    • Go语言编译程序从后台运行,不出现dos窗口的操作
    上一篇:为什么不建议在go项目中使用init()
    下一篇:一文搞懂Golang文件操作增删改查功能(基础篇)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息 语言,reflect.TypeOf,和,reflect.Type,