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

Go語言通過反射調用函數

如果反射值對象(reflect.Value)中值的類型為函數時,可以通過 reflect.Value 調用該函數。使用反射調用函數時,需要將參數使用反射值對象的切片 []reflect.Value 構造后傳入 Call() 方法中,調用完成時,函數的返回值通過 []reflect.Value 返回。

下面的代碼聲明一個加法函數,傳入兩個整型值,返回兩個整型值的和。將函數保存到反射值對象(reflect.Value)中,然后將兩個整型值構造為反射值對象的切片([]reflect.Value),使用 Call() 方法進行調用。

反射調用函數:
package main

import (
    "fmt"
    "reflect"
)

// 普通函數
func add(a, b int) int {

    return a + b
}

func main() {

    // 將函數包裝為反射值對象
    funcValue := reflect.ValueOf(add)

    // 構造函數參數, 傳入兩個整型值
    paramList := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}

    // 反射調用函數
    retList := funcValue.Call(paramList)

    // 獲取第一個返回值, 取整數值
    fmt.Println(retList[0].Int())
}
代碼說明如下:
  • 第 9~12 行,定義一個普通的加法函數。
  • 第 17 行,將 add 函數包裝為反射值對象。
  • 第 20 行,將 10 和 20 兩個整型值使用 reflect.ValueOf 包裝為 reflect.Value,再將反射值對象的切片 []reflect.Value 作為函數的參數。
  • 第 23 行,使用 funcValue 函數值對象的 Call() 方法,傳入參數列表 paramList 調用 add() 函數。
  • 第 26 行,調用成功后,通過 retList[0] 取返回值的第一個參數,使用 Int 取返回值的整數值。

提示

反射調用函數的過程需要構造大量的 reflect.Value 和中間變量,對函數參數值進行逐一檢查,還需要將調用參數復制到調用函數的參數內存中。調用完畢后,還需要將返回值轉換為 reflect.Value,用戶還需要從中取出調用值。因此,反射調用函數的性能問題尤為突出,不建議大量使用反射函數調用。

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

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

底部Logo