передать структуру получателя по ссылке - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужна функция для возврата структуры, которая была передана в функцию вызывающей стороной.Структура будет отличаться при каждом вызове функции.

Я использую и драйвер ORM postgres "github.com/go-pg/pg".Насколько я понимаю, ORM требует, чтобы структура была определена перед вызовом .Query (), который заполняет структуру данными из базы данных.

func PgSql(user User, statement string)(output []string, err error) {

_, err = db.Query(&users, `SELECT * FROM standard_lookup WHERE pkid_ = 'STATE|AFKDZ'`)

}

Результаты будут в пользовательской структуре.Однако мне нужно, чтобы эта структура была определена в другом пакете и передана в эту функцию.Есть ли какая-то магия интерфейса, которую я могу сделать здесь?

1 Ответ

0 голосов
/ 17 сентября 2018

Если вам нужно, чтобы каждый раз передавался другой тип, ваш аргумент должен быть интерфейсом, а указатель на структуру, которую нужно заполнить, должен передаваться в этот интерфейс:

func PgSql(dest interface{}, statement string)(output []string, err error) {
    _, err = db.Query(dest, statement)
    // handle error
}

func main() {
    var user User
    _, err := PgSql(&user, `SELECT * FROM standard_lookup WHERE pkid_ = 'STATE|AFKDZ'`)
    // handle error
}

Обратите внимание, что внутри функции PgSql вы передаете интерфейсную переменную dest напрямую, не указатель на нее. Это потому, что этот интерфейс уже содержит указатель (он вызывается с &user), поэтому вам не нужно передавать ссылку на интерфейс, только значение интерфейса (которое само по себе является ссылкой на в этом коде переменная user в main()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...