Заполните срез с указателями поля структуры - PullRequest
0 голосов
/ 28 июня 2019

Я создаю функцию, которая получает 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)
    }
}
...