C語言中文網 目錄
首頁 > Go語言教程 > Go語言反射 閱讀:1,631

Go語言通過反射訪問結構體成員的值

反射值對象(reflect.Value)提供對結構體訪問的方法,通過這些方法可以完成對結構體任意值的訪問,如下表所示。

反射值對象的成員訪問方法
方  法 備  注
Field(i int) Value 根據索引,返回索引對應的結構體成員字段的反射值對象。當值不是結構體或索引超界時發生宕機
NumField() int 返回結構體成員字段數量。當值不是結構體或索引超界時發生宕機
FieldByName(name string) Value 根據給定字符串返回字符串對應的結構體字段。沒有找到時返回零值,當值不是結構體或索引超界時發生宕機
FieldByIndex(index []int) Value 多層成員訪問時,根據 []int 提供的每個結構體的字段索引,返回字段的值。 沒有找到時返回零值,當值不是結構體或索引超界時發生宕機
FieldByNameFunc(match func(string) bool) Value 根據匹配函數匹配需要的字段。找到時返回零值,當值不是結構體或索引超界時發生宕機

下面代碼構造一個結構體包含不同類型的成員。通過 reflect.Value 提供的成員訪問函數,可以獲得結構體值的各種數據。

反射訪問結構體成員值:
package main

import (
    "fmt"
    "reflect"
)

// 定義結構體
type dummy struct {
    a int
    b string

    // 嵌入字段
    float32
    bool

    next *dummy
}


func main() {

    // 值包裝結構體
    d := reflect.ValueOf(dummy{
            next: &dummy{},
    })

    // 獲取字段數量
    fmt.Println("NumField", d.NumField())

    // 獲取索引為2的字段(float32字段)
    floatField := d.Field(2)

    // 輸出字段類型
    fmt.Println("Field", floatField.Type())

    // 根據名字查找字段
    fmt.Println("FieldByName(\"b\").Type", d.FieldByName("b").Type())

    // 根據索引查找值中, next字段的int字段的值
    fmt.Println("FieldByIndex([]int{4, 0}).Type()", d.FieldByIndex([]int{4, 0}).Type())
}
代碼說明如下:
  • 第 9 行,定義結構體,結構體的每個字段的類型都不一樣。
  • 第 24 行,實例化結構體并包裝為 reflect.Value 類型,成員中包含一個 *dummy 的實例。
  • 第 29 行,獲取結構體的字段數量。
  • 第 32 和 35 行,獲取索引為2的字段值(float32 字段),并且打印類型。
  • 第 38 行,根據b字符串,查找到 b 字段的類型。
  • 第 41 行,[]int{4,0} 中的 4 表示,在 dummy 結構中索引值為 4 的成員,也就是 next。next 的類型為 dummy,也是一個結構體,因此使用 []int{4,0} 中的 0 繼續在 next 值的基礎上索引,結構為 dummy 中索引值為 0 的 a 字段,類型為 int。

代碼輸出如下:
NumField 5
Field float32
FieldByName("b").Type string
FieldByIndex([]int{4, 0}).Type() int

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo