Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memanggil Variadic Rows.Scan() Secara Dinamik Menggunakan Reflection in Go?

Bagaimana untuk Memanggil Variadic Rows.Scan() Secara Dinamik Menggunakan Reflection in Go?

DDD
Lepaskan: 2024-12-04 00:58:13
asal
884 orang telah melayarinya

How to Dynamically Call Variadic Rows.Scan() Using Reflection in Go?

Memanggil Fungsi Variadik dengan Refleksi untuk Imbasan SQL

Apabila menggunakan fungsi Rows.Scan() untuk pertanyaan pangkalan data SQL, ia menjadi perlu untuk gunakan refleksi untuk mengambil kira bilangan pembolehubah penunjuk yang diterimanya. Ini membolehkan hirisan mengisi secara dinamik dengan data daripada hasil pertanyaan.

Langkah untuk Mengimbas Secara Dinamik Menggunakan Refleksi

Untuk memanggil fungsi variadik seperti Rows.Scan() menggunakan pantulan , ikuti langkah berikut:

  1. Dapatkan Lajur Maklumat: Gunakan rows.Columns() untuk mendapatkan semula nama lajur.
  2. Buat Slices: Buat dua keping: satu untuk nilai (nilai) dan satu forpointer (valuePtrs), kedua-duanya sepadan dengan panjang lajur.
  3. Imbas Data: Dalam gelung untuk setiap baris dalam set hasil, lelaran pada setiap lajur dan tetapkan penunjuk kepada keping valuePtrs. Kemudian, panggil baris.Scan(valuePtrs...).
  4. Dapatkan Nilai: Selepas mengimbas, data akan tersedia dalam kepingan nilai. Tukar []bait kepada rentetan jika perlu.

Contoh Kod

Coretan kod berikut menunjukkan cara mengimbas secara dinamik menggunakan pantulan:

package main

import (
    "fmt"
    _ "github.com/lib/pq"
    "database/sql"
)

func main() {
    db, _ := sql.Open("postgres", "connection_string")
    rows, _ := db.Query("SELECT * FROM my_table")

    columns, _ := rows.Columns()
    count := len(columns)
    values := make([]interface{}, count)
    valuePtrs := make([]interface{}, count)

    for rows.Next() {
        for i := range columns {
            valuePtrs[i] = &values[i]
        }
        rows.Scan(valuePtrs...)
        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)
        }
    }
}
Salin selepas log masuk

Dengan melaksanakan kaedah ini, anda boleh mengisi kepingan secara dinamik dengan hasil pertanyaan tanpa menyatakan jenis data dalam terlebih dahulu.

Atas ialah kandungan terperinci Bagaimana untuk Memanggil Variadic Rows.Scan() Secara Dinamik Menggunakan Reflection in Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan