我正在使用反射作为快速&脏脚本处理程序,但我无法弄清楚错误检查
如何检查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)
}
答案 0 :(得分:3)
来自标准文档:
零值表示无值。它的IsValid方法返回false,其Kind方法返回Invalid,其String方法返回“”
因此,您希望对MethodByName返回的值使用IsValid方法。如果它是假的则有错误。