如何使用MethodByName检查实际函数是否存在?

时间:2017-05-16 20:16:57

标签: go reflection error-handling

我正在使用反射作为快速&脏脚本处理程序,但我无法弄清楚错误检查

如何检查MethodByName是否找到了有效的方法?

Docs说零值 - 零值是什么?

任何人都可以提供帮助吗?

https://play.golang.org/p/ogypx-wLay

type step struct {
  Action    string
  Parameter string
  Second    string
}

func doStep(little step) (err error) {
  apiR := reflect.ValueOf(skript{})

  apiF := apiR.MethodByName(little.Action)
  if apiF == reflect.Zero(reflect.TypeOf(skript.Approve)) {
    return errors.New("xxx")
  }
  args := []reflect.Value{reflect.ValueOf(little.Parameter), reflect.ValueOf(little.Second)}
  apiF.Call(args)
  return nil
}

type skript struct{}

func (skript) Approve(who string, dummy string) {
  fmt.Println("Approve ", who, dummy)
}

func main() {
  st1 := step{"Approve", "me", "ok"}
  st2 := step{"Block", "me", "ok"}
  doStep(st1)
  doStep(st2)
}

1 个答案:

答案 0 :(得分:3)

来自标准文档:

  

零值表示无值。它的IsValid方法返回false,其Kind方法返回Invalid,其String方法返回“”

因此,您希望对MethodByName返回的值使用IsValid方法。如果它是假的则有错误。