Go テストでは、関数キャストとリフレクションを使用して、より柔軟で保守しやすいテスト ケースを作成できます。関数キャストを使用すると、ある型の関数を別の型に変換できますが、リフレクションを使用すると、型と値を検査して操作できます。実際の場合、モック関数の作成、関数タイプのチェック、テスト ケースの動的生成、および一般的なテスト関数の作成に使用できます。
Go テストでは、関数型変換とリフレクションは 2 つの強力なツールであり、次のことが可能になります。より柔軟で保守しやすいテスト ケースを作成します。
関数型変換を使用すると、ある型の関数を別の型に変換できます。たとえば、int パラメータを受け取り文字列を返す関数を、float64 パラメータを受け取りブール値を返す関数に変換できます。
func IntToString(i int) string { return strconv.Itoa(i) } func main() { var f func(float64) bool // 类型转换 f = func(f float64) bool { return f > 0.5 } fmt.Println(f(0.75)) // 输出: true }
Reflection を使用すると、型と値を検査して操作できます。リフレクションを使用すると、関数の名前、パラメーターの型、戻り値の型を取得したり、関数を動的に呼び出すこともできます。
func CallFunction(f interface{}, args ...interface{}) (interface{}, error) { fv := reflect.ValueOf(f) t := fv.Type() if t.Kind() != reflect.Func { return nil, errors.New("f is not a function") } // 检查fn的参数类型和返回类型 in := make([]reflect.Value, 0, len(args)) for _, v := range args { in = append(in, reflect.ValueOf(v)) } // 动态调用函数 out := fv.Call(in) // 检查输出的类型 outType := t.Out(0) outValue := out[0] if outType.Kind() == reflect.Interface { return outValue.Interface(), nil } else { return outValue.Convert(outType).Interface(), nil } } func main() { f := func(a int, b float64) string { return fmt.Sprintf("%d + %.2f = %.2f", a, b, float64(a)+b) } result, err := CallFunction(f, 1, 2.5) if err != nil { panic(err) } fmt.Println(result) // 输出: "1 + 2.50 = 3.50" }
テストでは、関数型の変換とリフレクションは次のシナリオで使用できます:
以上がテストにおける golang 関数の型変換とリフレクションの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。