Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menggunakan Reflection untuk Memanggil Pangkalan Data/SQL Rows.Scan() Variadic Function?

Bagaimana Menggunakan Reflection untuk Memanggil Pangkalan Data/SQL Rows.Scan() Variadic Function?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 09:56:11752semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn