funcexec( v interface{}, // value f interface{}, // valueを引数に実行するfunc )interface{} { fv := reflect.ValueOf(f) if fv.Kind() != reflect.Func{ panic("2'nd argument is not func.") } rv := reflect.ValueOf(v) return fv.Call([]reflect.Value{rv})[0] }
// 以下のように使える exec(5, func(i int)int{ return i * ( i + 1) }) exec("Tom", func(s string)string{ return"hello! " + s })
// 第一引数と、第二引数の引数の型が違うと、buildはできるが実行時にエラーが起きる exec("Tom", func(i int)int{ return i * ( i + 1) })