Ну наконец-то я нашел решение. Как видно из приведенного ниже кода, сначала я делаю запрос SQL, в котором не указывается название столбцов. Затем я беру информацию о столбцах с помощью функции ColumnTypes()
. Эта функция возвращает информацию о столбце, такую как тип столбца, длина и значение NULL. Далее я узнаю название и тип столбцов, заполните интерфейс этими данными:
for i, column := range columns {
object[column.Name()] = reflect.New(column.ScanType()).Interface()
values[i] = object[column.Name()]
}
Полный код, который я использую, выглядит следующим образом:
var GetFilters = func(responseWriter http.ResponseWriter, request *http.Request) {
rows, err := database.ClickHouse.Query("SELECT * FROM table_name;"); if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
var objects []map[string]interface{}
for rows.Next() {
columns, err := rows.ColumnTypes(); if err != nil {
fmt.Println(err)
return
}
values := make([]interface{}, len(columns))
object := map[string]interface{}{}
for i, column := range columns {
object[column.Name()] = reflect.New(column.ScanType()).Interface()
values[i] = object[column.Name()]
}
if err = rows.Scan(values...); err != nil {
fmt.Println(err)
return
}
objects = append(objects, object)
}
utils.Response(responseWriter, http.StatusOK, objects)
}