英文:
How to check if the actual function exists using MethodByName?
问题
我正在使用反射作为一个快速且简单的脚本处理程序,但是我无法弄清楚错误检查的方法。
如何检查MethodByName是否找到了有效的方法?
文档中说的是零值-什么是零值?
有人能帮忙吗?
以下是代码的翻译部分:
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)
}
请注意,我只翻译了代码部分,不包括问题本身。
英文:
I am using reflection as a quick & dirty script handler but I can't figure out the error checking
How do I check that MethodByName has found a valid method?
Docs say zero value - what zero value?
anybody able to help?
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
得分: 4
根据标准文档:
> zero Value 表示没有值。它的 IsValid 方法返回 false,它的 Kind 方法返回 Invalid,它的 String 方法返回 "
所以你想在从 MethodByName 返回的值上使用 IsValid 方法。如果它返回 false,表示出现了错误。
英文:
From standard docs:
> The zero Value represents no value. Its IsValid method returns false, its Kind method returns Invalid, its String method returns "<invalid Value>"
So you want to use the IsValid method on the returned value from MethodByName. If it's false there was an error.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论