99/*
1010call user's function througth reflect.
1111*/
12- func invokeFun (fun any , args ... any ) (ret reflect. Value , err error ) {
12+ func invokeFun (fun any , args ... any ) (ret [] any , err error ) {
1313 // catch if panic by user code.
1414 defer func () {
1515 if r := recover (); r != nil {
@@ -24,10 +24,10 @@ func invokeFun(fun any, args ...any) (ret reflect.Value, err error) {
2424 fnType := fn .Type ()
2525 numIn := fnType .NumIn ()
2626 if numIn > len (args ) {
27- return reflect . ValueOf ( nil ) , fmt .Errorf ("function must have minimum %d params. Have %d" , numIn , len (args ))
27+ return nil , fmt .Errorf ("function must have minimum %d params. Have %d" , numIn , len (args ))
2828 }
2929 if numIn != len (args ) && ! fnType .IsVariadic () {
30- return reflect . ValueOf ( nil ) , fmt .Errorf ("func must have %d params. Have %d" , numIn , len (args ))
30+ return nil , fmt .Errorf ("func must have %d params. Have %d" , numIn , len (args ))
3131 }
3232 params := make ([]reflect.Value , len (args ))
3333 for i := 0 ; i < len (args ); i ++ {
@@ -39,24 +39,26 @@ func invokeFun(fun any, args ...any) (ret reflect.Value, err error) {
3939 }
4040 argValue := reflect .ValueOf (args [i ])
4141 if ! argValue .IsValid () {
42- return reflect . ValueOf ( nil ) , fmt .Errorf ("func Param[%d] must be %s. Have %s" , i , inType , argValue .String ())
42+ return nil , fmt .Errorf ("func Param[%d] must be %s. Have %s" , i , inType , argValue .String ())
4343 }
4444 argType := argValue .Type ()
4545 if argType .ConvertibleTo (inType ) {
4646 params [i ] = argValue .Convert (inType )
4747 } else {
48- return reflect . ValueOf ( nil ) , fmt .Errorf ("method Param[%d] must be %s. Have %s" , i , inType , argType )
48+ return nil , fmt .Errorf ("method Param[%d] must be %s. Have %s" , i , inType , argType )
4949 }
5050 }
5151
5252 result := fn .Call (params )
5353
54- //log.Println("invoke result:", result)
54+ ret = make ([] any , len ( result ) )
5555
56- if len ( result ) > 0 {
57- ret = result [ 0 ]
56+ for i , r := range result {
57+ ret [ i ] = r . Interface ()
5858 }
5959
60+ //log.Println("invoke result:", result)
61+
6062 return ret , nil
6163}
6264
0 commit comments