<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如果變數是一個結構體,我們還可以通過結構體域型別物件 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 %sn", 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 %sn", 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 語言的反射基礎 reflect.StructField 和 reflect.Method。通過反射,我們可以拿到型別資訊和定義的方法等,Go 的反射實現了反射的大多數功能,獲取型別資訊需要配合使用標準庫中的詞法、語法解析器和抽象語法數對原始碼進行掃描。下一篇文章將會繼續介紹 Go 語言的反射 reflect.Value 反射值物件相關內容。
以上就是Go語言反射獲取型別屬性和方法範例的詳細內容,更多關於Go反射獲取型別屬性方法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45