0
我使用反射作爲一個快速&骯髒的腳本處理程序,但我不能找出錯誤檢查如何使用MethodByName檢查實際函數是否存在?
如何檢查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)
}
Aww ...太慢了。很好的答案:) – RayfenWindspear
謝謝 - 比 好很多,如果apiF.Kind()!= reflect.Func 我正在嘗試 –
@DaveAppleton不工作的原因是因爲'Zero'正在創建一個零'Value '但是,當然,它們不會相互「對峙」,因爲它創造了一個新的「零值」。 – RayfenWindspear