2016-09-28 2 views
2

값 반영, 내가 가지고있는Golang가 돌아 내가 통화 반환 값으로 몇 가지 문제가 있어요

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

문제는 내가 평소하지 못할

전무 인 반환 값입니다 아래 오류 확인은 다음과 같습니다.

cannot convert nil to type reflect.Value 

내가 잘못한 내용을 인쇄하려고 할 때;

[<error Value>] 

이 오류 검사와 함께 앞으로 나아갈 방법이 없다면, 도움이 될 것입니다.

답변

2

Value.Call()이 값에 의해 표시되는 기능을 호출하고,이 함수의 리턴 값을 나타내는 슬라이스를 반환한다 (이것은 이동 기능과 슬라이스 있어야 및 방법은 다수의 반환 값을 가질 수있다). 반환 된 슬라이스 유형은 []reflect.Value입니다 (따라서 해당 요소의 유형은 reflect.Value이고 interface{}이 아닙니다).

함수 나 메서드가 오류를 반환하는 경우 반환 된 슬라이스에서 해당 요소를 검사 할 수 있습니다. Value.Interface()을 사용하면 reflect.Value 값에서 interface{} 값을 얻을 수 있습니다.

type My int 

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

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

My.Get()를 호출하면 결코 (이 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 "이고 중개자 변수를 가질 필요는 없지만 내 이슈를 덜 해결해 주셔서 감사합니다. –

+0

@ JohnDowling 예, 물론 그렇게 할 수 있습니다. 단계를 보여주고 이해하기 쉽게 여러 줄로 나누었습니다. – icza

관련 문제