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