Go の関数リフレクションは、関数情報を取得して操作し、それを動的に呼び出す機能を提供します。関数リフレクション オブジェクトは、そのシグネチャ、パラメータ、戻り値の情報を含む、reflect.ValueOf を通じて取得できます。動的に呼び出すには、引数のリフレクション値のリストを作成し、 f.Call(args) を介して呼び出しを行います。これにより、戻り値を含むリフレクション値のリストが返されます。実際には、この機能を使用してインターフェイスの種類に基づいてメソッドを動的に呼び出し、より柔軟なコードを実現できます。
リフレクションは、プログラムが型と値に関する情報をプログラム的に取得および操作できるようにする Go の強力な機能です。リフレクションを使用すると、関数のシグネチャ、パラメーター、戻り値にアクセスし、関数を動的に呼び出すことができます。
使用法
関数のリフレクション オブジェクトを取得するには、reflect.ValueOf
関数を使用できます:
f := reflect.ValueOf(func(x, y int) int { return x + y })
これにより、関数 func
に関する情報を含む Reflection オブジェクトが作成されます。このリフレクション オブジェクトを使用して、関数のシグネチャ、パラメータ、戻り値にアクセスできます。
f.Type()
型を返します。関数のパラメータと戻り値の型が含まれます。 f.NumIn()
関数のパラメータの数を返します。f.In(i)
は ## を返します。 #i パラメータのリフレクション オブジェクト。
関数の戻り値の数を返します
f.Out(i)
i 値を返すリフレクション オブジェクトを返します。
動的呼び出し
リフレクションを使用すると、次のように関数を動的に呼び出すことができます:args := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)} result := f.Call(args)
args は関数パラメータ値のリフレクション オブジェクトのリスト。
f.Call(args) 関数を呼び出して、戻り値を含むリフレクション オブジェクトのリストを返します。
実際的なケース
インターフェイスの種類に基づいてインターフェイスを実装するメソッドを動的に呼び出すことができるリフレクション ユーティリティを作成してみましょう:
import ( "fmt" "reflect" ) type Calculator interface { Add(x, y int) int } func ReflectCall(fn interface{}, args []reflect.Value) { fnVal := reflect.ValueOf(fn) if fnType := fnVal.Type(); fnType.Kind() == reflect.Func { result := fnVal.Call(args) fmt.Println(result[0].Interface()) } else { fmt.Println("Not a function!") } } func main() { calc := CalculatorImpl{} ReflectCall(calc.Add, []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}) } type CalculatorImpl struct{} func (c CalculatorImpl) Add(x, y int) int { return x + y }
ReflectCall 関数を使用して、
Calculator インターフェイス タイプに基づいて
Add メソッドを動的に呼び出します。
以上がgolang機能の反映の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。