反射不僅可以獲取值的型別資訊,還可操作變數的值。使用reflect.value
型別操作變數的值。
v :=
make([
]int,10
) valuev := reflect.
valueof
(v)
fmt.
println
(valuev.
isvalid()
)// true
fmt.
println
(valuev.
isnil()
)// false
fmt.
println
(valuev.
inte***ce()
.(int)
)// [0 0 0 0 0 0 0 0 0 0]
fmt.
println
(valuev.
slice(0
, valuev.
len())
)// [0 0 0 0 0 0 0 0 0 0]
獲取值的操作支援很多,對應的資料型別都支援。例如func (v value) int() int64
,func (v value) float() float64
,func (v value) string() string
等。
利用反射可以完成值的修改,func (v value) elem() value
方法獲取值反射對應的元素,再利用類settype
方法完成設定,示例:
v :=
42valuev := reflect.
valueof
(&v)
valuev.
elem()
.setint
(1024
)fmt.
println
(v)// 1024
注意,修改值需要滿足可被定址的要求,因此我們使用的是reflect.valueof(&v)
。
反射修改結構體欄位,需要先獲取結構體的值反射物件,再去確定字段,再去修改。演示為:
s :=
&stu
values := reflect.
valueof
(s) values.
elem()
.fieldbyname
("name").
setstring
("kang"
) fmt.
println
(s.name)
// kang
注意,修改結構體字段時,要保證欄位能被匯出,首字母大寫。
完!原文出自:小韓說課
Go語言反射
反射是指在程式執行過程中對程式本身進行訪問和修改的能力。程式在編譯時,變數被轉換為記憶體位址,變數名不會被編譯器寫入到可執行部分。在執行程式時,程式無法獲取自身資訊。支援反射的語言可以在程式編譯期將變數的反射資訊,如欄位名稱 型別資訊 結構體資訊等整合到可執行檔案中,並給程式提供介面的訪問反射資訊,...
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...
Go語言反射3
任意值通過 reflect.typeof 獲得反射物件資訊後,如果他的型別是結構體,可以通過反射值物件 reflect.type 的numfield 和field 方法獲得結構體成員的詳細方法。reflect.type 中與獲取結構體成員相關的方法如下表所示 方法說明 field i int str...