Go語言反射之值反射

2021-08-31 00:17:57 字數 1435 閱讀 1951

反射不僅可以獲取值的型別資訊,還可操作變數的值。使用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() int64func (v value) float() float64func (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...