2017-05-16 41 views
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) 
} 

回答

3

從標準文檔:

零值表示沒有的值。它的IsValid方法返回false,它的Kind方法返回Invalid,其String方法返回「」

所以你想對來自MethodByName的返回值使用IsValid方法。如果它是錯誤的,那就是錯誤。

+0

Aww ...太慢了。很好的答案:) – RayfenWindspear

+0

謝謝 - 比 好很多,如果apiF.Kind()!= reflect.Func 我正在嘗試 –

+1

@DaveAppleton不工作的原因是因爲'Zero'正在創建一個零'Value '但是,當然,它們不會相互「對峙」,因爲它創造了一個新的「零值」。 – RayfenWindspear

相關問題