Я столкнулся с проблемами использования библиотеки отражений. Я descided использовать его из-за многих Рекомендации, но я только учусь идти и некоторые части не очень легко ..Перейти: задуматься: вызвать слишком мало аргументов ввода
Я получил эту часть кода:
func countDataByName(sourceName string, statData interface{}, filters Filter, chartName string) []ChartElement {
...
//step 1 - filter
filteredData := reflect.ValueOf(statData).MethodByName("FilterData").Call([]reflect.Value{})
//step 2 - cluster
// clusterData := reflect.ValueOf(filteredData).MethodByName("clusterData").Call([]reflect.Value{})
//step 3 - count
// countedData := reflect.ValueOf(clusterData).MethodByName(chartName).Call([]reflect.Value{})
fmt.Println("Never prints to anywhere", filteredData)
...
return filterData
}
Если я исполняю метод вроде этого, я получаю ошибку: reflect: Call with too few input arguments
. Но если я изменю reflect.ValueOf(statData)
на reflect.ValueOf(&statData)
чем ошибки reflect: call of reflect.Value.Call on zero Value
statData
поставляется с одним из 2-х типов, и передняя этого типов У меня есть и методы структур, как это:
type NoaggModel struct {
Date string
Hour int
Id_user int
Id_line int
Id_region int
Id_tree_devision int
N_inb int
N_inb_d int
T_ring int
T_inb int
T_inb_d int
T_hold int
T_acw int
T_acw_d int
T_wait int
}
func (ng *NoaggModel) FilterData(data NoaggModel) {
fmt.Println("FilterData")
fmt.Println("data : ", data)
}
это Println также не работает. Паника кода выше, и метод не запускался. Где моя ошибка здесь?
Upd 1:
Найдено, что если удалить из параметров data
в functioin, что я хочу позвонить, чем это требует красиво. Но! У меня есть statData
как 1 строка, структур, поэтому тип NoaggModel
. И в методе FilterData
я получаю эту 1 строку как ng
. Но мне нужно изменить его на []NoaggModel
. Как вызвать reflect
в этом случае и как передать параметр функции фильтра?
Upd 2: Я изменил несколько частей:
func (ng *NoaggModel) FilterData(filter interface{}, data NoaggModel) {
fmt.Println("data : ",ng)
}
здесь, как передать правильный тип для filter
, если он установлен в Ревеле контроллера и метод в модели. Или я должен установить тип в каждой модели и вызвать его в контроллере?
И в контроллере я писал:
//step 1 - filter
in := make([]reflect.Value, 2)
in[0] = reflect.ValueOf(filters)
in[1] = reflect.ValueOf(statData)
filteredData := reflect.ValueOf(statData).MethodByName("FilterData").Call(in)
StatData
является строка типа NoaggModel, но я получаю сообщение об ошибке:
reflect: Call using *models.NoaggModel as type models.NoaggModel
типа был установлен также reflect
в коде выше, как это:
...
var sourceTypes = map[string]reflect.Type{
"noagg": reflect.TypeOf(models.NoaggModel{}),
"oracle": reflect.TypeOf(models.OracleModel{}),
}
deserializedData = reflect.New(sourceTypes[sourceName]).Interface()
...
// deserialised becomes statData
Если вы новичок в Go, вы не должны использовать отражение. Никто не должен рекомендовать его, особенно не кому-то, изучающему язык. Я понятия не имею, что ваш код пытается сделать. – Volker
Я пытаюсь вызвать функцию моего пользовательского интерфейса. Я назову это успешно. И узнал, как передать параметры, но получает ошибку '' 'reflect: Call using * models.NoaggModel как типы models.NoaggModel'''. Я обновлю свои вопросы для деталей. – Altenrion
'Elem()' помогает указателям разыменования внутри reflect.Values и может помочь. – Volker