Memanggil Fungsi Variadik Scan() dengan Refleksi
Fungsi Rows.Scan() menyediakan cara yang mudah untuk mendapatkan data daripada pangkalan data pertanyaan. Walau bagaimanapun, ia menggunakan bilangan penunjuk yang berubah-ubah sebagai hujahnya, yang boleh mencabar untuk digabungkan menggunakan refleksi. Pertimbangkan senario berikut:
Anda mahu mengisi kepingan secara dinamik dengan nilai yang diperoleh daripada pertanyaan dan menggunakan Rows.Scan() untuk mengekstrak data. Dalam kes ini, anda perlu menentukan bilangan lajur dan membuat kepingan untuk menyimpan nilai.
Perangkap Biasa:
Percubaan untuk menggunakan refleksi untuk memanggil Fungsi Scan() boleh membawa kepada hasil yang tidak dijangka. Ini kerana Rows.Scan() menjangkakan penunjuk kepada nilai, dan hanya menghantar sekeping nilai antara muka{} akan menghasilkan rujukan sifar.
Penyelesaian:
Untuk berjaya memanggil Scan() dengan refleksi, pendekatan dwi-slice digunakan. Potongan pertama, nilai, memegang data sebenar, manakala kepingan kedua, valuesPtrs, mengandungi penunjuk kepada setiap elemen dalam nilai.
Untuk setiap lajur dalam hasil pertanyaan, penunjuk dalam valuesPtrs dipetakan kepada elemen yang sepadan dalam nilai. Selepas itu, Rows.Scan() boleh digunakan dengan valuesPtrs sebagai hujahnya, dengan berkesan mengisi nilai.
Contoh Berfungsi:
package main import ( "fmt" _ "github.com/lib/pq" "database/sql" ) func main() { db, _ := sql.Open( "postgres", "user=postgres dbname=go_testing password=pass sslmode=disable") rows, _ := db.Query("SELECT * FROM _user;") columns, _ := rows.Columns() count := len(columns) values := make([]interface{}, count) valuesPtrs := make([]interface{}, count) for rows.Next() { for i := range columns { valuesPtrs[i] = &values[i] } rows.Scan(valuesPtrs...) for i, col := range columns { val := values[i] b, ok := val.([]byte) var v interface{} if (ok) { v = string(b) } else { v = val } fmt.Println(col, v) } } }
Dalam contoh ini, baris. Scan() digunakan dengan nilai hirisan penunjukPtrs, mengisi hirisan nilai dengan nilai yang diambil data. Gelung kemudian mencetak setiap nama lajur dan nilai yang sepadan.
Atas ialah kandungan terperinci Bagaimana Menggunakan Reflection untuk Memanggil Pangkalan Data/SQL Rows.Scan() Variadic Function?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!