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

标签 go reflection error-handling

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

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

文档说零值 - 什么是零值?

有人能帮忙吗?

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)
}

最佳答案

来自标准文档:

The zero Value represents no value. Its IsValid method returns false, its Kind method returns Invalid, its String method returns ""

因此,您想对 MethodByName 的返回值使用 IsValid 方法。如果它是 false,则表示有错误。

关于go - 如何使用 MethodByName 检查实际函数是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44010827/

相关文章:

visual-studio-2010 - PostBuildEvent 多脚本错误处理

go - 处理零 slice 索引的更好方法

dictionary - go1.10.3中add key/value与mapassign方法的关系

mongodb - 如何使用 golang mgo 驱动程序自动增加 mongodb 的 id 字段?

batch-file - "> was unexpected at this time."- 批处理/命令脚本

php - 在特定条件下重做最后一个 foreach 循环命令

go - fatal error : 'libavcodec/avcodec.h' file not found caused by zergon321/reisen

c# - 在运行时创建类型为对象的实例

android - 如何使用反射将 nfc_extras 添加到 android 项目?

java - 使用反射重置枚举单例字段