Heim > Backend-Entwicklung > Golang > Wie rufe ich Variadic Rows.Scan() mithilfe von Reflection in Go dynamisch auf?

Wie rufe ich Variadic Rows.Scan() mithilfe von Reflection in Go dynamisch auf?

DDD
Freigeben: 2024-12-04 00:58:13
Original
884 Leute haben es durchsucht

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

Aufrufen variadischer Funktionen mit Reflection für den SQL-Scan

Bei Verwendung der Rows.Scan()-Funktion für SQL-Datenbankabfragen ist dies erforderlich Verwenden Sie Reflektion, um die variable Anzahl der akzeptierten Zeiger zu berücksichtigen. Dies ermöglicht das dynamische Auffüllen von Slices mit Daten aus einem Abfrageergebnis.

Schritte zum dynamischen Scannen mithilfe von Reflection

Um eine variadische Funktion wie Rows.Scan() mithilfe von Reflection aufzurufen , folgen Sie diesen Schritten:

  1. Spalteninformationen abrufen:Verwenden rows.Columns() zum Abrufen der Spaltennamen.
  2. Slices erstellen: Erstellen Sie zwei Slices: eines für Werte (values) und eines für Zeiger (valuePtrs), die beide der Länge der Spalten entsprechen .
  3. Daten scannen: Iterieren Sie in der Schleife für jede Zeile im Ergebnissatz über jede Spalte und Weisen Sie dem valuePtrs-Slice Zeiger zu. Rufen Sie dann rows.Scan(valuePtrs...) auf.
  4. Werte abrufen: Nach dem Scannen sind die Daten im Werte-Slice verfügbar. Konvertieren Sie das []Byte bei Bedarf in Zeichenfolgen.

Codebeispiel

Der folgende Codeausschnitt zeigt, wie mithilfe von Reflektion dynamisch gescannt wird:

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)
        }
    }
}
Nach dem Login kopieren

Durch die Implementierung dieser Methode können Sie Slices dynamisch mit Abfrageergebnissen füllen, ohne die Datentypen im Voraus anzugeben.

Das obige ist der detaillierte Inhalt vonWie rufe ich Variadic Rows.Scan() mithilfe von Reflection in Go dynamisch auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage