2016-09-28 3 views
2

値反映、私が持っているGolangが戻り、私が呼び出しに戻り値を持ついくつかの問題を抱えてい

err := reflect.ValueOf(a.a).MethodByName(gatherList[x]).Call([]reflect.Value{}) 

問題は、私はいつものを行うカント

nilの戻り値であり、以下のエラーチェックは次のようになります。

cannot convert nil to type reflect.Value 

私はerrの内容を印刷しようとします。

[<error Value>] 

このエラーチェックでどのように動くかわからない場合は、どんな助けも素晴らしいでしょう。

Value.Call()

答えて

2

値で表される関数を呼び出し、関数の戻り値を表すスライスを返す(これは、移動機能と同様にスライスでなければならず、方法は、複数の戻り値を有していてもよいです)。返されるスライスのタイプは[]reflect.Valueです(その要素のタイプはreflect.Valueで、interface{}ではありません)。

関数またはメソッドでもエラーが返された場合は、返されたスライスの対応する要素を調べることができます。 Value.Interface()を使用して、reflect.Valueの値からinterface{}の値を取得することができます。

この例を参照してください:My.Get()を呼び出す

type My int 

func (m My) Get() error { 
    return nil 
} 

func (m My) GetError() error { 
    return fmt.Errorf("artificial error") 
} 

は、(それがnilを返す)エラーを返していない、とMy.GetError()を呼び出すと、常に非nilエラーを返すん。

反射でそれらを呼び出す:

methods := []string{"Get", "GetError"} 
for _, m := range methods { 
    result := reflect.ValueOf(My(0)).MethodByName(m).Call(nil) 
    err := result[0].Interface() 
    if err == nil { 
     fmt.Println("No error returned by", m) 
    } else { 
     fmt.Printf("Error calling %s: %v", m, err) 
    } 
} 

出力(Go Playground上でそれを試してみてください):

No error returned by Get 
Error calling GetError: artificial error 
+0

パーフェクトを、私は私がもし結果[0] .Interface(」やるだけの可能性をメモしました)== nil "と仲介varを持つ必要性を削除しますが、私の問題を解決するnether以下、ありがとう。 –

+0

@ JohnDowlingはい、もちろん、それを行うことができます、私はステップを表示し、理解しやすくするために複数の行に分割しました。 – icza

関連する問題