У меня есть несколько таблиц базы данных с конкретной структурой для каждой таблицы.Я использую 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 ускользает от меня.