«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как использовать отражение для вызова базы данных/SQL Rows.scan () Variadic функция?

Как использовать отражение для вызова базы данных/SQL Rows.scan () Variadic функция?

Опубликовано в 2025-02-06
Просматривать:704

] How to Use Reflection to Call the Database/SQL Rows.Scan() Variadic Function?

вызов функции scan () variadic с Reflection

функция Rows.Scan () предоставляет удобный способ извлечения данных из базы данных запрос. Тем не менее, он использует переменное количество указателей в качестве своих аргументов, что может быть сложно включить с использованием отражения. Рассмотрим следующий сценарий:

вы хотите динамически заполнить срез со значениями, полученными из запроса, и используйте Rows.scan () для извлечения данных. В этом случае вам необходимо определить количество столбцов и создать среза для хранения значений. Функция scan () может привести к неожиданным результатам. Это связано с тем, что Rows.Scan () ожидает указателей на значения, и просто прохождение значений интерфейса {} приведет к ссылкам на NIL.

решение:

Чтобы успешно вызвать сканирование () с размышлением, используется двойной подход. Первый срез, значения, содержит фактические данные, в то время как второй срез, Valuesptrs, содержит указатели на каждый элемент в значениях.

] для каждого столбца в результате запроса, указатель в значениях. в значениях. Впоследствии rows.scan () можно использовать со значениями в качестве его аргумента, эффективно заполнение значений.

Рабочий пример:

Main Package импорт ( "FMT" _ "github.com/lib/pq" "База данных/SQL" ) func main () { db, _: = sql.open ( "Postgres", "user = postgres dbname = go_testing password = pass sslmode = disable") ряды, _: = db.query ("select * from _user;") столбцы, _: = row.columns () Подсчет: = LEN (столбцы) значения: = make ([] интерфейс {}, count) valuesptrs: = make ([] интерфейс {}, count) для рядов.next () { для i: = диапазон столбцов { valuesptrs [i] = & values ​​[i] } row.scan (valuesptrs ...) для i, col: = диапазон столбцов { val: = values ​​[i] b, ok: = val. ([] byte) var v интерфейс {} if (ok) { v = строка (b) } еще { v = val } fmt.println (col, v) } } }

В этом примере rows.scan () вызывается с помощью значений среза указателя, заполняя срез значений полученными данными. Цикл затем печатает имя каждого столбца и его соответствующее значение. ]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3