Golang 反射 type 和 kind 有什麼區別?
一、前言
Go 語言中的反射是由 reflect 包提供支持的,它定義了兩個重要的類型 Type 和 Value 。任意值在反射中都可以理解爲由 reflect.Type 和 reflect.Value 兩部分組成,並且 reflect 包提供了 reflect.TypeOf 和 reflect.ValueOf 兩個函數來獲取任意對象的 Value 和 Type。
在 Go 語言程序中,使用 reflect.TypeOf() 函數可以獲得任意值的類型對象(reflect.Type),程序通過類型對象可以訪問任意值的類型信息。
1.1 Kind 和 Type 區別
相較於 Type 而言,Kind 所表示的範疇更大。類似於家用電器(Kind)和電視機(Type)之間的對應關係。或者電視機(Kind)和 42 寸彩色電視機(Type)
Type 是類型。Kind 是類別。Type 和 Kind 可能相同,也可能不同。通常基礎數據類型的 Type 和 Kind 相同,自定義數據類型則不同。
對於反射中的 kind 我們既可以通過 reflect.Type 來獲取,也可以通過 reflect.Value 來獲取。他們得到的值和類型均是相同的。
1.1.1 Kind
種類(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 // 底層指針
)
二、舉例說明
import (
"fmt"
"reflect"
)
type cat struct {
name string
}
func main() {
typeCat := reflect.TypeOf(cat{})
fmt.Println(typeCat.Name(), typeCat.Kind())
var a int
typeA := reflect.TypeOf(a)
fmt.Println(typeA.Name(), typeA.Kind())
}
輸出結果:
cat struct
int int
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/D_QeiCmUjVxeSlW82ksbgw