reflect

reflect包
在Go语言的反射机制中,任何接口值都由是一个具体类型和具体类型的值两部分组成的。
在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。

package main

import (
    "fmt"
    "reflect"
)

type Cat struct {
}

func reflectType(x interface{}) {
    val := reflect.TypeOf(x)
    fmt.Println(val)
    fmt.Printf("type:%v kind:%v\n", val.Name(), val.Kind())

}

func reflectValue(x interface{}) {
    val := reflect.ValueOf(x)
    key := val.Kind()

    switch key {
    case reflect.Int64:
        fmt.Println("type is Int64, value is  ", int64(val.Int()))
    case reflect.Float32:
        fmt.Println("type is Float32, value is  ", float32(val.Float()))

    }

}

func main() {

    var a int64 = 1
    reflectType(a)
    var b float32 = 0.1
    reflectType(b)

    var c = Cat{}
    reflectType(c)

    reflectValue(a)
    reflectValue(b)
    reflectValue(c)

}

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

标签: none

添加新评论