在go語言中,可以通過反射來獲取類型信息;只需要調用reflect包的TypeOf()函數(shù)即可。方法:1、使用“reflect.TypeOf()”函數(shù)取得指定變量的類型對象;2、使用Name()和Kind()獲取類型對象的類型信息,語法“類型對象.Name()”和“類型對象.Kind()”。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
在go語言中,可以通過反射獲取類型信息。
在 Go語言中通過調用 reflect.TypeOf 函數(shù),我們可以從一個任何非接口類型的值創(chuàng)建一個 reflect.Type 值。reflect.Type 值表示著此非接口值的類型。通過此值,我們可以得到很多此非接口類型的信息。當然,我們也可以將一個接口值傳遞給一個 reflect.TypeOf 函數(shù)調用,但是此調用將返回一個表示著此接口值的動態(tài)類型的 reflect.Type 值。
實際上,reflect.TypeOf 函數(shù)的唯一參數(shù)的類型為 interface{},reflect.TypeOf 函數(shù)將總是返回一個表示著此唯一接口參數(shù)值的動態(tài)類型的 reflect.Type 值。
那如何得到一個表示著某個接口類型的 reflect.Type 值呢?我們必須通過下面將要介紹的一些間接途徑來達到這一目的。
類型 reflect.Type 為一個接口類型,它指定了若干方法。 通過這些方法,我們能夠觀察到一個 reflect.Type 值所表示的 Go類型的各種信息。這些方法中的有的適用于所有種類的類型,有的只適用于一種或幾種類型。通過不合適的 reflect.Type 屬主值調用某個方法將在運行時產生一個恐慌。
使用 reflect.TypeOf() 函數(shù)可以獲得任意值的類型對象(reflect.Type),程序通過類型對象可以訪問任意值的類型信息。下面通過例子來理解獲取類型對象的過程:
package main import ( "fmt" "reflect" ) func main() { var a int typeOfA := reflect.TypeOf(a) fmt.Println(typeOfA.Name(), typeOfA.Kind()) }
代碼輸出如下:
代碼說明如下:
-
第 10 行,定義一個 int 類型的變量。
-
第 12 行,通過 reflect.TypeOf() 取得變量 a 的類型對象 typeOfA,類型為 reflect.Type()。
-
第 14 行中,通過 typeOfA 類型對象的成員函數(shù),可以分別獲取到 typeOfA 變量的類型名為 int,種類(Kind)為 int。
擴展知識:反射的類型(Type)與種類(Kind)
在使用反射時,需要首先理解類型(Type)和種類(Kind)的區(qū)別。編程中,使用最多的是類型,但在反射中,當需要區(qū)分一個大品種的類型時,就會用到種類(Kind)。例如,需要統(tǒng)一判斷類型中的指針時,使用種類(Kind)信息就較為方便。