Я создаю функцию, которая получает interface{}
, которая всегда будет структурой, но это может быть любая структура.
Мне нужно заполнить один фрагмент указателями всех полей полученной структуры. Место в коде ниже, где мне нужно выбрать указатель поля, помечено **FIELD POINTER**
Моя последняя цель - создать функцию для получения struct , эквивалентной возвращению запроса, отправленного в параметре sqlQuery . Я хочу создать динамическую функцию для выполнения любого типа запроса на выбор, всегда используя структуру, полученную для .Scan
.
Может быть, я не так думаю, я все еще начинаю Голанг.
func QuerySelect(entity interface{}, sqlQuery string) {
val := reflect.Indirect(reflect.ValueOf(entity))
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Validate database params
db, err := sql.Open(driver, psqlInfo)
// If returned any error
if err != nil {
panic(err)
}
// Validate connection with database
err = db.Ping()
if err != nil {
panic(err)
}
// Execute query
rows, err := db.Query(sqlQuery)
countColumns := val.Type().NumField()
var allRows []interface{}
for rows.Next() {
columnsPointers := make([]interface{}, countColumns)
for i := 0; i < countColumns; i++ {
columnsPointers[i] = **FIELD POINTER (entity struct)**
}
if err := rows.Scan(columnsPointers...); err != nil {
log.Fatal(err)
}
allRows = append(allRows, entity)
}
}