掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
任意值通過 reflect.TypeOf() 獲得反射對(duì)象信息后,如果它的類型是結(jié)構(gòu)體,可以通過反射值對(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)站。
| 方法 | 說明 |
|---|---|
| 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)體字段的信息。沒有找到時(shí) bool 返回 false,當(dāng)類型不是結(jié)構(gòu)體或索引超界時(shí)發(fā)生宕機(jī) |
| FieldByIndex(index []int) StructField | 多層成員訪問時(shí),根據(jù) []int 提供的每個(gè)結(jié)構(gòu)體的字段索引,返回字段的信息。沒有找到時(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ī) |
reflect.Type 的 Field() 方法返回 StructField 結(jié)構(gòu),這個(gè)結(jié)構(gòu)描述結(jié)構(gòu)體的成員信息,通過這個(gè)信息可以獲取成員與結(jié)構(gòu)體的關(guān)系,如偏移、索引、是否為匿名字段、結(jié)構(gòu)體標(biāo)簽(Struct Tag)等,而且還可以通過 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 // 是否為匿名字段
}字段說明如下。
下面代碼中,實(shí)例化一個(gè)結(jié)構(gòu)體并遍歷其結(jié)構(gòu)體成員,再通過 reflect.Type 的 FieldByName() 方法查找結(jié)構(gòu)體中指定名稱的字段,直接獲取其類型信息。
反射訪問結(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)
}
// 通過字段名, 找到字段類型信息
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
代碼說明如下:
`開始和結(jié)尾的字符串。這個(gè)字符串在 Go 語(yǔ)言中被稱為 Tag(標(biāo)簽)。一般用于給字段添加自定義信息,方便其他模塊根據(jù)信息進(jìn)行不同功能的處理。
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流