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