func.go 927 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package mhayaReflect
  2. import (
  3. "reflect"
  4. cerr "github.com/mhaya/error"
  5. )
  6. var (
  7. nilFuncInfo = FuncInfo{}
  8. )
  9. type FuncInfo struct {
  10. Type reflect.Type
  11. Value reflect.Value
  12. InArgs []reflect.Type
  13. InArgsLen int
  14. OutArgs []reflect.Type
  15. OutArgsLen int
  16. }
  17. func GetFuncInfo(fn interface{}) (FuncInfo, error) {
  18. if fn == nil {
  19. return nilFuncInfo, cerr.FuncIsNil
  20. }
  21. typ := reflect.TypeOf(fn)
  22. if typ.Kind() != reflect.Func {
  23. return nilFuncInfo, cerr.FuncTypeError
  24. }
  25. var inArgs []reflect.Type
  26. for i := 0; i < typ.NumIn(); i++ {
  27. t := typ.In(i)
  28. inArgs = append(inArgs, t)
  29. }
  30. var outArgs []reflect.Type
  31. for i := 0; i < typ.NumOut(); i++ {
  32. t := typ.Out(i)
  33. outArgs = append(outArgs, t)
  34. }
  35. funcInfo := FuncInfo{
  36. Type: typ,
  37. Value: reflect.ValueOf(fn),
  38. InArgs: inArgs,
  39. InArgsLen: typ.NumIn(),
  40. OutArgs: outArgs,
  41. OutArgsLen: typ.NumOut(),
  42. }
  43. return funcInfo, nil
  44. }