新聞中心
任意值通過(guò) reflect.TypeOf() 獲得反射對(duì)象信息后,如果它的類型是結(jié)構(gòu)體,可以通過(guò)反射值對(duì)象(reflect.Type)的 NumField() 和 Field() 方法獲得結(jié)構(gòu)體成員的詳細(xì)信息。與成員獲取相關(guān)的 reflect.Type 的方法如下表所示。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),懷寧企業(yè)網(wǎng)站建設(shè),懷寧品牌網(wǎng)站建設(shè),網(wǎng)站定制,懷寧網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,懷寧網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
| 方法 | 說(shuō)明 |
|---|---|
| Field(i int) StructField | 根據(jù)索引,返回索引對(duì)應(yīng)的結(jié)構(gòu)體字段的信息。當(dāng)值不是結(jié)構(gòu)體或索引超界時(shí)發(fā)生宕機(jī) |
| NumField() int | 返回結(jié)構(gòu)體成員字段數(shù)量。當(dāng)類型不是結(jié)構(gòu)體或索引超界時(shí)發(fā)生宕機(jī) |
| FieldByName(name string) (StructField, bool) | 根據(jù)給定字符串返回字符串對(duì)應(yīng)的結(jié)構(gòu)體字段的信息。沒(méi)有找到時(shí) bool 返回 false,當(dāng)類型不是結(jié)構(gòu)體或索引超界時(shí)發(fā)生宕機(jī) |
| FieldByIndex(index []int) StructField | 多層成員訪問(wèn)時(shí),根據(jù) []int 提供的每個(gè)結(jié)構(gòu)體的字段索引,返回字段的信息。沒(méi)有找到時(shí)返回零值。當(dāng)類型不是結(jié)構(gòu)體或索引超界時(shí) 發(fā)生宕機(jī) |
| FieldByNameFunc( match func(string) bool) (StructField,bool) | 根據(jù)匹配函數(shù)匹配需要的字段。當(dāng)值不是結(jié)構(gòu)體或索引超界時(shí)發(fā)生宕機(jī) |
結(jié)構(gòu)體字段類型
reflect.Type 的 Field() 方法返回 StructField 結(jié)構(gòu),這個(gè)結(jié)構(gòu)描述結(jié)構(gòu)體的成員信息,通過(guò)這個(gè)信息可以獲取成員與結(jié)構(gòu)體的關(guān)系,如偏移、索引、是否為匿名字段、結(jié)構(gòu)體標(biāo)簽(Struct Tag)等,而且還可以通過(guò) StructField 的 Type 字段進(jìn)一步獲取結(jié)構(gòu)體成員的類型信息。StructField 的結(jié)構(gòu)如下:
type StructField struct {
Name string // 字段名
PkgPath string // 字段路徑
Type Type // 字段反射類型對(duì)象
Tag StructTag // 字段的結(jié)構(gòu)體標(biāo)簽
Offset uintptr // 字段在結(jié)構(gòu)體中的相對(duì)偏移
Index []int // Type.FieldByIndex中的返回的索引值
Anonymous bool // 是否為匿名字段
}字段說(shuō)明如下。
- Name:為字段名稱。
- PkgPath:字段在結(jié)構(gòu)體中的路徑。
- Type:字段本身的反射類型對(duì)象,類型為 reflect.Type,可以進(jìn)一步獲取字段的類型信息。
- Tag:結(jié)構(gòu)體標(biāo)簽,為結(jié)構(gòu)體字段標(biāo)簽的額外信息,可以單獨(dú)提取。
- Index:FieldByIndex 中的索引順序。
- Anonymous:表示該字段是否為匿名字段。
獲取成員反射信息
下面代碼中,實(shí)例化一個(gè)結(jié)構(gòu)體并遍歷其結(jié)構(gòu)體成員,再通過(guò) reflect.Type 的 FieldByName() 方法查找結(jié)構(gòu)體中指定名稱的字段,直接獲取其類型信息。
反射訪問(wèn)結(jié)構(gòu)體成員類型及信息:
package main
import (
"fmt"
"reflect"
)
func main() {
// 聲明一個(gè)空結(jié)構(gòu)體
type cat struct {
Name string
// 帶有結(jié)構(gòu)體tag的字段
Type int `json:"type" id:"100"`
}
// 創(chuàng)建cat的實(shí)例
ins := cat{Name: "mimi", Type: 1}
// 獲取結(jié)構(gòu)體實(shí)例的反射類型對(duì)象
typeOfCat := reflect.TypeOf(ins)
// 遍歷結(jié)構(gòu)體所有成員
for i := 0; i < typeOfCat.NumField(); i++ {
// 獲取每個(gè)成員的結(jié)構(gòu)體字段類型
fieldType := typeOfCat.Field(i)
// 輸出成員名和tag
fmt.Printf("name: %v tag: '%v'\n", fieldType.Name, fieldType.Tag)
}
// 通過(guò)字段名, 找到字段類型信息
if catType, ok := typeOfCat.FieldByName("Type"); ok {
// 從tag中取出需要的tag
fmt.Println(catType.Tag.Get("json"), catType.Tag.Get("id"))
}
}代碼輸出如下:
name: Name tag: ''
name: Type tag: 'json:"type" id:"100"'
type 100
代碼說(shuō)明如下:
- 第 11 行,聲明了帶有兩個(gè)成員的 cat 結(jié)構(gòu)體。
- 第 15 行,Type 是 cat 的一個(gè)成員,這個(gè)成員類型后面帶有一個(gè)以
`開始和結(jié)尾的字符串。這個(gè)字符串在 Go 語(yǔ)言中被稱為 Tag(標(biāo)簽)。一般用于給字段添加自定義信息,方便其他模塊根據(jù)信息進(jìn)行不同功能的處理。 - 第 19 行,創(chuàng)建 cat 實(shí)例,并對(duì)兩個(gè)字段賦值。結(jié)構(gòu)體標(biāo)簽屬于類型信息,無(wú)須且不能賦值。
- 第 22 行,獲取實(shí)例的反射類型對(duì)象。
- 第 25 行,使用 reflect.Type 類型的 NumField() 方法獲得一個(gè)結(jié)構(gòu)體類型共有多少個(gè)字段。如果類型不是結(jié)構(gòu)體,將會(huì)觸發(fā)宕機(jī)錯(cuò)誤。
- 第 28 行,reflect.Type 中的 Field() 方法和 NumField 一般都是配對(duì)使用,用來(lái)實(shí)現(xiàn)結(jié)構(gòu)體成員的遍歷操作。
- 第 31 行,使用 reflect.Type 的 Field() 方法返回的結(jié)構(gòu)不再是 reflect.Type 而是StructField 結(jié)構(gòu)體。
- 第 35 行,使用 reflect.Type 的 FieldByName() 根據(jù)字段名查找結(jié)構(gòu)體字段信息,cat Type 表示返回的結(jié)構(gòu)體字段信息,類型為 StructField,ok 表示是否找到結(jié)構(gòu)體字段的信息。
- 第 38 行中,使用 StructField 中 Tag 的 Get() 方法,根據(jù) Tag 中的名字進(jìn)行信息獲取。
名稱欄目:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言通過(guò)反射獲取結(jié)構(gòu)體的成員類型
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/djoggep.html


咨詢
建站咨詢
