я следующая функция конструктора запросов:Отражая поля пустых кусочков подстилающего типа?
func CreateQuery(t interface{}, where string) {
var b bytes.Buffer
b.WriteString("SELECT ")
s := reflect.ValueOf(t).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField() - 1; i++ {
b.WriteString(fmt.Sprintf("%s, ", typeOfT.Field(i).Name))
}
//Last one has no Comma
b.WriteString(fmt.Sprintf("%s ", typeOfT.Field(s.NumField() - 1).Name))
b.WriteString(fmt.Sprintf("FROM %s ", typeOfT.Name()))
b.WriteString(where)
fmt.Println(b.String())
}
Там хорошо работает, когда называюсь следующим образом:
var dst FooStruct
CreateQuery(&dst, "")
Но следующий поднимает «вызов reflect.Value.NumField на срез Значение» Panic :
var dst []FooStruct
CreateQuery(&dst, "")
Как я могу заставить функцию распечатать поля базового типа структуры среза? Похоже, я хочу, чтобы обратная функция отражения SliceOf
.
Получил его, поэтому мне нужно сделать что-то вроде: 'typeOfT: = s.Type()' , а затем 'ContainedtypeOfT: = typeOfT.Elem()'. Тогда остальная часть функции ссылается на 'ContainedtypeOfT' вместо' s' или 'TypeofT' –