中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Go語言反射獲取類型屬性

發布時間:2022-06-17 13:43:50 來源:億速云 閱讀:160 作者:iii 欄目:開發技術

本篇內容主要講解“怎么使用Go語言反射獲取類型屬性”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用Go語言反射獲取類型屬性”吧!

reflect.StructField 和 reflect.Method

如果變量是一個結構體,我們還可以通過結構體域類型對象 reflect.StructField 來獲取結構體下字段的類型屬性。Type 接口下提供了不少用于獲取字段結構體域類型對象的方法,我們主要介紹以下幾個接口:

	// 獲取一個結構體內的字段數量
	NumField() int
	// 根據 index 獲取結構體內的成員字段類型對象
	Field(i int) StructField
	// 根據字段名獲取結構體內的成員字段類型對象
	FieldByName(name string) (StructField, bool)

通過以上的 3 個方法,我們可以輕易地拿到一個結構體變量內的所有成員字段的類型對象 reflect.StructField。通過 reflect.StructField,我們可以知道成員字段所屬的類型和種類,其內主要由以下的屬性:

type StructField struct {
	// 成員字段的名稱
	Name string
	// 成員字段 Type
	Type      Type
	// Tag
	Tag       StructTag
	// 字節偏移
	Offset    uintptr
	// 成員字段的 index
	Index     []int
	// 成員字段是否公開
	Anonymous bool
}

StructField 中提供了 Type 用于獲取字段的的類型信息,而 StructTag 一般用來描述結構體成員字段的額外信息,比如在 JSON 進行序列化和對象映射時會被使用。StructTag 一般由一個或者多個鍵值對組成,一個簡單的例子如下:

ID string `json:"id"`

鍵與值使用 : 分隔,值用 "" 括起來, 鍵值對之間使用空格分隔。上面例子中說明 ID 字段在 JSON 序列化時會被變成 id 。

接下來,我們通過遍歷 Hero 結構體,獲取其內字段的類型并輸出,代碼如下所示:

func main()  {
	typeOfHero := reflect.TypeOf(Hero{})
	// 通過 #NumField 獲取結構體字段的數量
	for i := 0 ; i < typeOfHero.NumField(); i++{
		fmt.Printf("field' name is %s, type is %s, kind is %s\n", typeOfHero.Field(i).Name, typeOfHero.Field(i).Type, typeOfHero.Field(i).Type.Kind())
	}
	// 獲取名稱為 Name 的成員字段類型對象
	nameField, _ := typeOfHero.FieldByName("Name")
	fmt.Printf("field' name is %s, type is %s, kind is %s\n", nameField.Name, nameField.Type, nameField.Type.Kind())
}

預期的結果如下所示:

field' name is Name, type is string, kind is string
field' name is Age, type is int, kind is int
field' name is Speed, type is int, kind is int
field' name is Name, type is string, kind is string

上述代碼中先使用 Type#NumField 獲取 Hero 結構體中字段的數量,再通過 typeOfHero#Field 根據 index 獲取每個字段域類型對象并打印它們的類型信息。代碼最后還演示如何通過 typeOfHero#FieldByName 獲取了字段名為 Name 的字段域類型對象。

除了獲取結構體下的字段域類型對象,Type 還提供方法獲取接口下方法的方法類型對象 Method,接口方法描述如下:

	// 根據 index 查找方法
	Method(int) Method
	// 根據方法名查找方法
	MethodByName(string) (Method, bool)
	// 獲取類型中公開的方法數量
	NumMethod() int

獲取到的方法類型描述對象 Method 描述了方法的基本信息,包括方法名,方法類型等,代碼如下所示:

type Method struct {
	// 方法名
	Name    string
	// 方法類型
	Type  Type
	// 反射對象,可用于調用方法
	Func  Value
	// 方法的index
	Index int
}

在 Method 中 Func 字段是一個反射值對象,可用于進行方法的調用。如果 Method 是來自于接口類型反射得到的 Type ,那么 Func 傳遞的第一個參數需要為實現方法的接收器,這部分區別我們將在 Value 中進行具體的介紹。

我們可以通過 Type 中提供的方法獲取接口 Person 中方法的方法類型對象,代碼如下所示:

func main()  {
	// 聲明一個 Person 接口,并用 Hero 作為接收器
		var person Person = &Hero{}
	// 獲取接口Person的類型對象
	typeOfPerson := reflect.TypeOf(person)
	// 打印Person的方法類型和名稱
	for i := 0 ; i < typeOfPerson.NumMethod(); i++{
		fmt.Printf("method is %s, type is %s, kind is %s.\n", typeOfPerson.Method(i).Name, typeOfPerson.Method(i).Type, typeOfPerson.Method(i).Type.Kind())
	}
	method, _ := typeOfPerson.MethodByName("Run")
	fmt.Printf("method is %s, type is %s, kind is %s.\n", method.Name, method.Type, method.Type.Kind())
	}

預期的輸出結果如下所示:

method is Run, type is func(*main.Hero), kind is func
method is SayHello, type is func(*main.Hero, string), kind is func
method is Run, type is func(*main.Hero) string, kind is func.

除了通過 typeOfPerson#Method 根據 index 獲取方法類型對象,還可以使用 typeOfPerson#MethodByName 根據方法名查找對應的方法類型對象。從輸出結果可以看出,方法的種類均為 func,而類型則為方法的聲明。

到此,相信大家對“怎么使用Go語言反射獲取類型屬性”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜兰市| 从化市| 靖宇县| 大厂| 神农架林区| 平江县| 四平市| 中西区| 上杭县| 涞水县| 大理市| 康保县| 平利县| 寻乌县| 通海县| 定西市| 阿拉善右旗| 达孜县| 浑源县| 禹城市| 珠海市| 岑溪市| 平果县| 伽师县| 新余市| 鄄城县| 清流县| 上饶市| 太和县| 登封市| 濉溪县| 齐齐哈尔市| 建瓯市| 锡林浩特市| 隆化县| 永宁县| 师宗县| 和平县| 仁寿县| 宿迁市| 青海省|