Как извлечь конкретную структуру из интерфейса - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть несколько таблиц базы данных с конкретной структурой для каждой таблицы.Я использую sqlx.Мои функции для доступа к базе данных работают нормально для каждой конкретной структуры.

Поскольку многие из моих операций с базой данных (например, вставка строки) одинаковы для всех таблиц, я бы хотел немного их высушить, имея общуюнабор функций, которые принимают интерфейс и выполняют операции.

В функции, которая принимает интерфейс и вызывает функции sqlx (например, sqlx.Get), мне нужно вытащить конкретную структуру из интерфейса для передачи вSQLX.И я в тупике.

Я прочитал Законы Отражения .Я прочитал отражающую документацию к пакету.Я просмотрел все и, похоже, не могу правильно соединить части.

Специальный код:

type Persistable interface {
    DbFieldNames() []string
    DbPrepCreate() error
    TableName() string
}

type Session struct {} реализует эти методы и принимается как постоянный.

Это утверждение прекрасно работает (с явно созданной конкретной структурой.

// src is the Persistable passed into this function
dest := Session{}
err = stmt.Get(&dest, src)

Но использование этой явно созданной структуры в общей функции отрицает цель. Я хочу сделать следующее:

dest := SomeFunctionThatExtractsTheConcreteStruct( src ) # таким образом, что я могу передать это dest в sqlx.

Я использовал пакет отражения для проверки переменной src (тип, значение, вид, ......)Я легко вижу, что src содержит * Session. Я могу получить реальное значение. Но создание конкретного класса из src для передачи в sqlx ускользает от меня.

1 Ответ

0 голосов
/ 14 декабря 2018

У вас есть переменная с именем src с типом Persistable, содержащая *Session.Ваша цель - получить значение interface{}, содержащее *Session, для использования в качестве первого аргумента метода Get.

Поскольку Persistable можно назначить для interface{} (как и для всех типов), выможет просто передать src первому аргументу метода Get.

err = stmt.Get(src, args...)
...