新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言通過反射訪問結(jié)構(gòu)體成員的值
反射值對象(reflect.Value)提供對結(jié)構(gòu)體訪問的方法,通過這些方法可以完成對結(jié)構(gòu)體任意值的訪問,如下表所示。

| 方 法 | 備 注 |
|---|---|
| Field(i int) Value | 根據(jù)索引,返回索引對應(yīng)的結(jié)構(gòu)體成員字段的反射值對象。當值不是結(jié)構(gòu)體或索引超界時發(fā)生宕機 |
| NumField() int | 返回結(jié)構(gòu)體成員字段數(shù)量。當值不是結(jié)構(gòu)體或索引超界時發(fā)生宕機 |
| FieldByName(name string) Value | 根據(jù)給定字符串返回字符串對應(yīng)的結(jié)構(gòu)體字段。沒有找到時返回零值,當值不是結(jié)構(gòu)體或索引超界時發(fā)生宕機 |
| FieldByIndex(index []int) Value | 多層成員訪問時,根據(jù) []int 提供的每個結(jié)構(gòu)體的字段索引,返回字段的值。 沒有找到時返回零值,當值不是結(jié)構(gòu)體或索引超界時發(fā)生宕機 |
| FieldByNameFunc(match func(string) bool) Value | 根據(jù)匹配函數(shù)匹配需要的字段。找到時返回零值,當值不是結(jié)構(gòu)體或索引超界時發(fā)生宕機 |
下面代碼構(gòu)造一個結(jié)構(gòu)體包含不同類型的成員。通過 reflect.Value 提供的成員訪問函數(shù),可以獲得結(jié)構(gòu)體值的各種數(shù)據(jù)。
反射訪問結(jié)構(gòu)體成員值:
package main
import (
"fmt"
"reflect"
)
// 定義結(jié)構(gòu)體
type dummy struct {
a int
b string
// 嵌入字段
float32
bool
next *dummy
}
func main() {
// 值包裝結(jié)構(gòu)體
d := reflect.ValueOf(dummy{
next: &dummy{},
})
// 獲取字段數(shù)量
fmt.Println("NumField", d.NumField())
// 獲取索引為2的字段(float32字段)
floatField := d.Field(2)
// 輸出字段類型
fmt.Println("Field", floatField.Type())
// 根據(jù)名字查找字段
fmt.Println("FieldByName(\"b\").Type", d.FieldByName("b").Type())
// 根據(jù)索引查找值中, next字段的int字段的值
fmt.Println("FieldByIndex([]int{4, 0}).Type()", d.FieldByIndex([]int{4, 0}).Type())
}代碼說明如下:
- 第 9 行,定義結(jié)構(gòu)體,結(jié)構(gòu)體的每個字段的類型都不一樣。
- 第 24 行,實例化結(jié)構(gòu)體并包裝為 reflect.Value 類型,成員中包含一個 *dummy 的實例。
- 第 29 行,獲取結(jié)構(gòu)體的字段數(shù)量。
- 第 32 和 35 行,獲取索引為2的字段值(float32 字段),并且打印類型。
- 第 38 行,根據(jù)
b字符串,查找到 b 字段的類型。 - 第 41 行,[]int{4,0} 中的 4 表示,在 dummy 結(jié)構(gòu)中索引值為 4 的成員,也就是 next。next 的類型為 dummy,也是一個結(jié)構(gòu)體,因此使用 []int{4,0} 中的 0 繼續(xù)在 next 值的基礎(chǔ)上索引,結(jié)構(gòu)為 dummy 中索引值為 0 的 a 字段,類型為 int。
代碼輸出如下:
NumField 5
Field float32
FieldByName("b").Type string
FieldByIndex([]int{4, 0}).Type() int
當前標題:創(chuàng)新互聯(lián)GO教程:Go語言通過反射訪問結(jié)構(gòu)體成員的值
標題路徑:http://www.5511xx.com/article/cospgeh.html


咨詢
建站咨詢
