値で表される関数を呼び出し、関数の戻り値を表すスライスを返す(これは、移動機能と同様にスライスでなければならず、方法は、複数の戻り値を有していてもよいです)。返されるスライスのタイプは[]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] .Interface(」やるだけの可能性をメモしました)== nil "と仲介varを持つ必要性を削除しますが、私の問題を解決するnether以下、ありがとう。 –
@ JohnDowlingはい、もちろん、それを行うことができます、私はステップを表示し、理解しやすくするために複数の行に分割しました。 – icza