Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menggunakan Refleksi untuk Memanggil Fungsi `Rows.Scan()` Variadic?

Bagaimana Menggunakan Refleksi untuk Memanggil Fungsi `Rows.Scan()` Variadic?

DDD
DDDasal
2024-11-30 12:51:12268semak imbas

How to Use Reflection to Call a Variadic `Rows.Scan()` Function?

Cara Menggunakan Refleksi untuk Memanggil Fungsi Variadik Imbasan

Apabila beroperasi dengan hasil pangkalan data, mungkin perlu memanggil fungsi Rows.Scan() menggunakan pantulan. Walau bagaimanapun, ini boleh menjadi satu cabaran kerana keperluan fungsi untuk bilangan penunjuk yang berubah-ubah. Dalam artikel ini, kami akan menyelidiki penyelesaian praktikal yang menangani keperluan ini.

Dengan menggunakan refleksi, kami berhasrat untuk mengisi kepingan dengan nilai yang diperoleh daripada pertanyaan pangkalan data. Proses ini melibatkan penentuan bilangan lajur dan memperuntukkan sekeping antara muka kosong untuk memegang titik data. Pendekatan ini memberikan fleksibiliti dalam mengendalikan nilai tanpa pengetahuan awal tentang jenisnya.

Kod Contoh dan Pelaksanaan

Kod berikut menunjukkan pelaksanaan pendekatan ini:

package main

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

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)
    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)
        }
    }
}

Kunci Kejayaan

Kunci kepada pendekatan ini terletak pada menggunakan dua kepingan: satu menyimpan nilai dan satu lagi mengandungi penunjuk yang sepadan dengan setiap nilai. Selepas penunjuk digunakan, kepingan nilai diisi dengan data, menyediakan akses kepada titik data sebenar untuk pemprosesan selanjutnya.

Dengan memanfaatkan refleksi, kami memperkasakan kod kami dengan keupayaan untuk mengendalikan nilai yang jenisnya tidak diketahui terlebih dahulu. Fleksibiliti ini meningkatkan fleksibiliti dan kebolehgunaan semula interaksi pangkalan data kami.

Atas ialah kandungan terperinci Bagaimana Menggunakan Refleksi untuk Memanggil Fungsi `Rows.Scan()` Variadic?. 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