最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言反射獲取類型屬性和方法示例

 更新時間:2022年06月17日 11:22:43   作者:aoho  
這篇文章主要為大家介紹了本文將介紹?Go?反射?reflect.StructField?和?reflect.Method?相關(guān)的內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

reflect.StructField 和 reflect.Method

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

	// 獲取一個結(jié)構(gòu)體內(nèi)的字段數(shù)量
	NumField() int
	// 根據(jù) index 獲取結(jié)構(gòu)體內(nèi)的成員字段類型對象
	Field(i int) StructField
	// 根據(jù)字段名獲取結(jié)構(gòu)體內(nèi)的成員字段類型對象
	FieldByName(name string) (StructField, bool)

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

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

StructField

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

ID string `json:"id"`

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

遍歷 Hero 結(jié)構(gòu)體

接下來,我們通過遍歷 Hero 結(jié)構(gòu)體,獲取其內(nèi)字段的類型并輸出,代碼如下所示:

func main()  {
	typeOfHero := reflect.TypeOf(Hero{})
	// 通過 #NumField 獲取結(jié)構(gòu)體字段的數(shù)量
	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())
}

預(yù)期的結(jié)果如下所示:

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 結(jié)構(gòu)體中字段的數(shù)量,再通過 typeOfHero#Field 根據(jù) index 獲取每個字段域類型對象并打印它們的類型信息。代碼最后還演示如何通過 typeOfHero#FieldByName 獲取了字段名為 Name 的字段域類型對象。

Method

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

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

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

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

在 Method 中 Func 字段是一個反射值對象,可用于進行方法的調(diào)用。如果 Method 是來自于接口類型反射得到的 Type ,那么 Func 傳遞的第一個參數(shù)需要為實現(xiàn)方法的接收器,這部分區(qū)別我們將在 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())
	}

預(yù)期的輸出結(jié)果如下所示:

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 根據(jù) index 獲取方法類型對象,還可以使用 typeOfPerson#MethodByName 根據(jù)方法名查找對應(yīng)的方法類型對象。從輸出結(jié)果可以看出,方法的種類均為 func,而類型則為方法的聲明。

小結(jié)

本文主要介紹了 Go 語言的反射基礎(chǔ) reflect.StructField 和 reflect.Method。通過反射,我們可以拿到類型信息和定義的方法等,Go 的反射實現(xiàn)了反射的大多數(shù)功能,獲取類型信息需要配合使用標準庫中的詞法、語法解析器和抽象語法數(shù)對源碼進行掃描。下一篇文章將會繼續(xù)介紹 Go 語言的反射 reflect.Value 反射值對象相關(guān)內(nèi)容。

以上就是Go語言反射獲取類型屬性和方法示例的詳細內(nèi)容,更多關(guān)于Go反射獲取類型屬性方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決goland中編輯tpl文件不高亮沒智能補全的問題

    解決goland中編輯tpl文件不高亮沒智能補全的問題

    這篇文章主要介紹了解決goland中編輯tpl文件不高亮沒智能補全的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go1.21新增maps包的用法詳解

    Go1.21新增maps包的用法詳解

    maps?包提供了幾個非常有用的用于操作?map?類型(任何類型的?map)的函數(shù),本文為大家整理了部分函數(shù)的具體用法,感興趣的小伙伴可以了解一下
    2023-08-08
  • golang API請求隊列的實現(xiàn)

    golang API請求隊列的實現(xiàn)

    本文主要介紹了golang API請求隊列的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 破解IDEA(Goland)注冊碼設(shè)置 license server一直有效不過期的過程詳解

    破解IDEA(Goland)注冊碼設(shè)置 license server一直有效不過期的過程詳解

    這篇文章主要介紹了破解IDEA(Goland)注冊碼設(shè)置 license server一直有效不過期,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Golang中的new()和make()函數(shù)本質(zhì)區(qū)別

    Golang中的new()和make()函數(shù)本質(zhì)區(qū)別

    在 Go 語言開發(fā)中,new() 和 make() 是兩個容易讓開發(fā)者感到困惑的內(nèi)建函數(shù),盡管它們都用于內(nèi)存分配,但其設(shè)計目的、適用場景和底層實現(xiàn)存在本質(zhì)差異,本文將通過類型系統(tǒng)、內(nèi)存模型和編譯器實現(xiàn)三個維度,深入解析這兩個函數(shù)的本質(zhì)區(qū)別,感興趣的朋友一起看看吧
    2025-02-02
  • 使用go操作redis的有序集合(zset)

    使用go操作redis的有序集合(zset)

    這篇文章主要介紹了使用go操作redis的有序集合(zset),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang打印復(fù)雜結(jié)構(gòu)體兩種方法詳解

    Golang打印復(fù)雜結(jié)構(gòu)體兩種方法詳解

    在?Golang?語言開發(fā)中,我們經(jīng)常會使用結(jié)構(gòu)體類型,如果我們使用的結(jié)構(gòu)體類型的變量包含指針類型的字段,我們在記錄日志的時候,指針類型的字段的值是指針地址,將會給我們?debug?代碼造成不便
    2022-10-10
  • 詳解如何在Go語言中循環(huán)數(shù)據(jù)結(jié)構(gòu)

    詳解如何在Go語言中循環(huán)數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要為大家詳細介紹了如何在Go語言中循環(huán)數(shù)據(jù)結(jié)構(gòu)(循環(huán)字符串、循環(huán)map結(jié)構(gòu)和循環(huán)Struct),文中的示例代碼代碼講解詳細,需要的可以參考一下
    2022-10-10
  • 使用Go進行單元測試的實現(xiàn)

    使用Go進行單元測試的實現(xiàn)

    這篇文章主要介紹了使用Go進行單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Go語言的接口詳解

    Go語言的接口詳解

    這篇文章主要介紹了go語言的接口,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧,希望能夠給你帶來幫助
    2021-10-10

最新評論

句容市| 巴东县| 清新县| 微山县| 建宁县| 嘉峪关市| 澄城县| 时尚| 汽车| 漳平市| 抚顺县| 囊谦县| 洛阳市| 武陟县| 华坪县| 壶关县| 高密市| 枣阳市| 江门市| 宜阳县| 赞皇县| 曲松县| 牙克石市| 阜南县| 依兰县| 泽普县| 阳信县| 玉树县| 桂阳县| 临泉县| 宜州市| 额济纳旗| 新宁县| 蓬溪县| 六安市| 无为县| 惠水县| 锡林郭勒盟| 泗阳县| 丽江市| 秦安县|