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] .Interface ("다만 수있는 메모를했다) == nil "이고 중개자 변수를 가질 필요는 없지만 내 이슈를 덜 해결해 주셔서 감사합니다. –
@ JohnDowling 예, 물론 그렇게 할 수 있습니다. 단계를 보여주고 이해하기 쉽게 여러 줄로 나누었습니다. – icza