]
вызов функции scan () variadic с Reflection
функция Rows.Scan () предоставляет удобный способ извлечения данных из базы данных запрос. Тем не менее, он использует переменное количество указателей в качестве своих аргументов, что может быть сложно включить с использованием отражения. Рассмотрим следующий сценарий:
вы хотите динамически заполнить срез со значениями, полученными из запроса, и используйте Rows.scan () для извлечения данных. В этом случае вам необходимо определить количество столбцов и создать среза для хранения значений. Функция scan () может привести к неожиданным результатам. Это связано с тем, что Rows.Scan () ожидает указателей на значения, и просто прохождение значений интерфейса {} приведет к ссылкам на NIL.
решение:
] для каждого столбца в результате запроса, указатель в значениях. в значениях. Впоследствии 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