任意值通過 **reflect.typeof()獲得反射物件資訊後,如果他的型別是結構體,可以通過反射值物件(reflect.type)的numfield()和field()**方法獲得結構體成員的詳細方法。
reflect.type() 中與獲取結構體成員相關的方法如下表所示:
方法說明
field(i int) structfield
根據索引,返回索引對應的結構體字段的資訊
numfield() int
返回結構體成員字段數量
fieldbyname(name string)(structfield,bool)
根據給定字串返回字串對應的結構體字段的資訊
fieldbyindex(index int)structfield
多層成員訪問時,根據int提供的每個結構體的字段索引,返回欄位的資訊
fieldbynamefunc(match func(string) bool) (structfield,bool)
根據傳入的匹配函式匹配需要的字段
nummethod() int
返回該型別方法集中 方法的數目
method(int)method
返回該型別方法集中 的第i個方法
methodbyname(string)(method bool)
根據方法名返回該型別方法集 中 的方法
structfield型別用來描述結構體中的乙個欄位的資訊。
structfield的定義如下:
type structfield struct
當我們使用反射得到乙個結構體資料之後可以通過索引依次獲取其欄位資訊,也可以通過欄位名去獲取指定的字段資訊。
type student struct
func
main()
t := reflect.
typeof
(stu1)
fmt.
println
(t.name()
, t.
kind()
)// student struct
// 通過for迴圈遍歷結構體的所有字段資訊
for i :=
0; i < t.
numfield()
; i++
// 通過欄位名獲取指定結構體欄位資訊
if scorefield, ok := t.
fieldbyname
("score"
); ok
}
接下來編寫乙個函式 printmethod(s inte***ce{})來遍歷列印s 包含的所有方法。
// 給student新增兩個方法 study和sleep(注意首字母大寫)
func
(s student)
study()
string
func
(s student)
sleep()
string
func
printmethod
(x inte***ce
) v.
method
(i).
call
(args)
}}
Go語言反射
反射是指在程式執行過程中對程式本身進行訪問和修改的能力。程式在編譯時,變數被轉換為記憶體位址,變數名不會被編譯器寫入到可執行部分。在執行程式時,程式無法獲取自身資訊。支援反射的語言可以在程式編譯期將變數的反射資訊,如欄位名稱 型別資訊 結構體資訊等整合到可執行檔案中,並給程式提供介面的訪問反射資訊,...
Go語言反射之值反射
反射不僅可以獲取值的型別資訊,還可操作變數的值。使用reflect.value型別操作變數的值。v make int,10 valuev reflect.valueof v fmt.println valuev.isvalid true fmt.println valuev.isnil false ...
GO語言練習 反射
列舉幾個反射的例子 1 簡單型別反射,2 複雜型別反射,3 對反射回來的資料的可修改屬性 1 簡單型別反射 1.1 package main import fmt reflect func main 1.2 執行結果 go run reflect.go type float64 kind is fl...