次のコードは、2 つの整数値を受け取り、2 つの整数値の合計を返す加算関数を宣言します。関数をリフレクション値オブジェクト (reflect.Value) に保存し、2 つの整数値をリフレクション値オブジェクト ([]reflect.Value) のスライスとして構築し、Call() メソッドを使用して呼び出します。
リフレクションコール機能:
package main
import (
"fmt"
"reflect"
)
// 通常の関数
func add(a、b int) int {
return a + b
}
func main() {
// 関数を反射値オブジェクトにラップする
funcValue:= reflect.ValueOf(add)
// 関数パラメータを構築し、2つの整数値を渡します
paramList:= []reflect.Value {reflect.ValueOf(10)、reflect.ValueOf(20)}
// 反射による関数呼び出し
retList:= funcValue.Call(paramList)
// 最初の戻り値を取得し、整数値を取得します
fmt.Println(retList [0] .Int())
}
コードの説明は次のとおりです。
- 9 ~ 12 行目は通常の加算関数を定義しています。
- 17 行目では、add 関数をリフレクション値オブジェクトとしてラップしています。
- 20行目では、reflect.ValueOfを使用して2つの整数値10と20をreflect.Valueにパックし、リフレクション値オブジェクトのスライス[]reflect.Valueを関数のパラメータとして使用します。
- 23 行目では、funcValue 関数値オブジェクトの Call() メソッドを使用して、パラメーター リスト paramList を渡して add() 関数を呼び出します。
- 26 行目では、呼び出しが成功した後、retList[0] を通じて戻り値の最初のパラメーターを取得し、Int を使用して戻り値の整数値を取得します。
ヒント
リフレクションによる関数呼び出しのプロセスでは、多数のreflect.Value変数と中間変数を構築し、関数のパラメータ値を1つずつ確認し、呼び出しパラメータを呼び出し関数のパラメータメモリにコピーする必要があります。呼び出しが完了したら、戻り値をreflect.Valueに変換する必要があり、ユーザーはそこから呼び出し値を取得する必要があります。したがって、リフレクティブ関数呼び出しのパフォーマンスの問題は特に顕著であり、リフレクティブ関数呼び出しを大量に使用することはお勧めできません。