日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言通過(guò)反射獲取結(jié)構(gòu)體的成員類型

任意值通過(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)站。

結(jié)構(gòu)體成員訪問(wèn)的方法列表

方法 說(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