Как получить доступ к пользовательскому типу в отражении. Возврат? - PullRequest
1 голос
/ 14 июня 2019

Я знаю, что писать идиотские функции на Go не идиоматично, но я хочу изучить свои варианты, прежде чем погрузиться в go generate.

Проблема, с которой я столкнулся, заключается в том, что Value.Call() возвращает фрагмент, где интересующий меня элемент является указателем на пользовательскую структуру. Похоже, я не могу найти способ получить доступ к этому.

returns := listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
fmt.Println(returns)

выход

[<vspk.EnterpriseProfilesList Value> <*bambou.Error Value>]

определение типа:

type EnterpriseProfilesList []*EnterpriseProfile

Я хочу получить доступ к vspk.EnterpriseProfilesList, но я изо всех сил пытаюсь это сделать.

Если я попытаюсь получить базовое значение следующим образом:

returns := listMethod.Call([]reflect.Value{reflect.ValueOf(filter)})
ret1 := returns[0].Interface()
fmt.Println(ret1)

Я получаю

[0xc0000fc7e0]

1 Ответ

2 голосов
/ 14 июня 2019

Value.Call() возвращает значение типа []reflect.Value.То, что вас интересует, это первое значение этого среза: returns[0].

Это, конечно, будет тип reflect.Value.Чтобы извлечь значение, заключенное в него, используйте Value.Interface().

Это будет тип interface{}.Если вам нужен конкретный тип, используйте утверждение типа :

returns[0].Interface().(spk.EnterpriseProfilesList)

Например:

if list, ok := returns[0].Interface().(spk.EnterpriseProfilesList); ok {
    // here list is of type spk.EnterpriseProfilesList
} else {
    // it was nil or not of type spk.EnterpriseProfilesList
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...