1. 程式人生 > >Go語言反射之值反射

Go語言反射之值反射

文章目錄

1 概述

反射不僅可以獲取值的型別資訊,還可操作變數的值。使用 reflect.Value 型別操作變數的值。

2 值反射物件

reflect.ValueOf() 方法可以獲取一個值的反射物件,之後可以獲取值的相關資訊,或者獲取這個值。示例:

  v := make([]int, 10)
  valueV := reflect.ValueOf(v)
  
  fmt.Println(valueV.IsValid(
)) // true fmt.Println(valueV.IsNil()) // false fmt.Println(valueV.Interface().([]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]
  • .IsValid().IsNil(),是獲取值的資訊,判斷是否合法和是否為Nil。
  • .Interface().([]int),利用型別斷言獲取原始值。
  • .Slice(0, valueV.Len()),通過型別獲取原始值。

獲取值的操作支援很多,對應的資料型別都支援。例如 func (v Value) Int() int64

func (v Value) Float() float64func (v Value) String() string 等。

3 修改值

利用反射可以完成值的修改,func (v Value) Elem() Value 方法獲取值反射對應的元素,再利用 類setType 方法完成設定,示例:

v := 42
valueV := reflect.ValueOf(&v)
valueV.Elem().SetInt(1024)
fmt.Println(v) // 1024

注意,修改值需要滿足可被定址的要求,因此我們使用的是 reflect.ValueOf(&v)

4 修改結構體欄位值

反射修改結構體欄位,需要先獲取結構體的值反射物件,再去確定欄位,再去修改。演示為:

  s := &Stu{
    "Hank",
  }
  valueS := reflect.ValueOf(s)
  valueS.Elem().FieldByName("Name").SetString("Kang")
  fmt.Println(s.Name) // Kang

注意,修改結構體欄位時,要保證欄位能被匯出,首字母大寫。

完!
原文出自:小韓說課
微信關注:小韓說課
小韓說課