2016-09-28 3 views
2

Я имею несколько проблем с возвращаемых значений по вызову, у меня нижеGolang Reflect Возвращаемые значения

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

вопрос с возвращаемым значением, которое является нулевым

Я не могу сделать обычный когда я получаю следующее.

cannot convert nil to type reflect.Value 

Когда я пытаюсь распечатать содержимое ошибки, я получаю;

[<error Value>] 

не совсем уверен, как двигаться вперед с этой проверкой ошибок, любая помощь будет отличной.

ответ

2

Value.Call() вызывает функцию, представленную значением, и возвращает срез который представляет возвращенные значения функции (он должен быть срез, как и в функции Go и методы могут иметь несколько возвращаемых значений). Возвращаемый срез имеет тип []reflect.Value (поэтому его элементы имеют тип reflect.Value, а не interface{}).

Если ваша функция или метод также возвращает ошибку, вы можете проверить соответствующий элемент в возвращаемом фрагменте. Вы можете использовать Value.Interface(), чтобы получить значение как interface{} от reflect.Value.

Смотрите этот пример:

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) 
    } 
} 

Output (попробовать его на Go Playground):

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

совершенен, я сделал к сведению, что я мог бы просто сделать «, если результат [0] .Interface () == nil "и удалить необходимость иметь посредника var, но решить мою проблему, тем меньше, спасибо. –

+0

@JohnDowling Да, конечно, вы можете это сделать, я разбил его на несколько строк, чтобы показать шаги и упростить их понимание. – icza

Смежные вопросы