C語言中文網 目錄
首頁 > Go語言教程 > Go語言反射 閱讀:3,328

Go語言reflect.ValueOf()和reflect.Value(通過反射獲取值信息)

反射不僅可以獲取值的類型信息,還可以動態地獲取或者設置變量的值。Go 語言中使用 reflect.Value 獲取和設置變量的值。

使用反射值對象包裝任意值

Go 語言中,使用 reflect.ValueOf() 函數獲得值的反射值對象(reflect.Value)。書寫格式如下:

value := reflect.ValueOf(rawValue)

reflect.ValueOf 返回 reflect.Value 類型,包含有 rawValue 的值信息。reflect.Value 與原值間可以通過值包裝和值獲取互相轉化。reflect.Value 是一些反射操作的重要類型,如反射調用函數。

從反射值對象獲取被包裝的值

Go 語言中可以通過 reflect.Value 重新獲得原始值。

1) 從反射值對象(reflect.Value)中獲取值的方法

可以通過下面幾種方法從反射值對象 reflect.Value 中獲取原值,如下表所示。

反射值獲取原始值的方法
方法名 說  明
Interface() interface {} 將值以 interface{} 類型返回,可以通過類型斷言轉換為指定類型
Int() int64 將值以 int 類型返回,所有有符號整型均可以此方式返回
Uint() uint64 將值以 uint 類型返回,所有無符號整型均可以此方式返回
Float() float64 將值以雙精度(float64)類型返回,所有浮點數(float32、float64)均可以此方式返回
Bool() bool 將值以 bool 類型返回
Bytes() []bytes 將值以字節數組 []bytes 類型返回
String() string 將值以字符串類型返回

2) 從反射值對象(reflect.Value)中獲取值的例子

下面代碼中,將整型變量中的值使用 reflect.Value 獲取反射值對象(reflect.Value)。再通過 reflect.Value 的 Interface() 方法獲得 interface{} 類型的原值,通過 int 類型對應的 reflect.Value 的 Int() 方法獲得整型值。
package main

import (
    "fmt"
    "reflect"
)

func main() {

    // 聲明整型變量a并賦初值
    var a int = 1024

    // 獲取變量a的反射值對象
    valueOfA := reflect.ValueOf(a)

    // 獲取interface{}類型的值, 通過類型斷言轉換
    var getA int = valueOfA.Interface().(int)

    // 獲取64位的值, 強制類型轉換為int類型
    var getA2 int = int(valueOfA.Int())

    fmt.Println(getA, getA2)
}
代碼輸出如下:
1024 1024

代碼說明如下:
  • 第 11 行,聲明一個變量,類型為 int,設置初值為 1024。
  • 第 14 行,獲取變量 a 的反射值對象,類型為 reflect.Value,這個過程和 reflect.TypeOf() 類似。
  • 第 17 行,將 valueOfA 反射值對象以 interface{} 類型取出,通過類型斷言轉換為 int 類型并賦值給 getA。
  • 第 20 行,將 valueOfA 反射值對象通過 Int 方法,以 int64 類型取出,通過強制類型轉換,轉換為原本的 int 類型。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo