Heim > Backend-Entwicklung > Golang > Wie verwende ich Reflection, um eine Variadic-Funktion „Rows.Scan()' aufzurufen?

Wie verwende ich Reflection, um eine Variadic-Funktion „Rows.Scan()' aufzurufen?

DDD
Freigeben: 2024-11-30 12:51:12
Original
265 Leute haben es durchsucht

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

So nutzen Sie Reflection zum Aufrufen der Scan Variadic-Funktion

Beim Arbeiten mit Datenbankergebnissen kann es erforderlich sein, die Funktion Rows.Scan() mithilfe von Reflection aufzurufen. Dies kann jedoch eine Herausforderung darstellen, da die Funktion eine variable Anzahl von Zeigern erfordert. In diesem Artikel werden wir uns mit einer praktischen Lösung befassen, die diesem Bedarf gerecht wird.

Durch den Einsatz von Reflektion wollen wir einen Bereich mit Werten füllen, die aus einer Datenbankabfrage stammen. Der Prozess umfasst die Bestimmung der Anzahl der Spalten und die Zuweisung eines Abschnitts leerer Schnittstellen zur Aufnahme der Datenpunkte. Dieser Ansatz bietet Flexibilität bei der Handhabung von Werten ohne vorherige Kenntnis ihrer Typen.

Beispielcode und -implementierung

Der folgende Code veranschaulicht die Implementierung dieses Ansatzes:

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

Schlüssel zum Erfolg

Der Schlüssel zu diesem Ansatz liegt darin, zwei zu beschäftigen Slices: Eines speichert die Werte und das andere enthält Zeiger, die jedem Wert entsprechen. Nachdem die Zeiger verwendet wurden, wird das Werte-Slice mit den Daten gefüllt und bietet Zugriff auf die tatsächlichen Datenpunkte für die weitere Verarbeitung.

Durch die Nutzung von Reflektion verleihen wir unserem Code die Fähigkeit, Werte zu verarbeiten, deren Typen sind nicht im Voraus bekannt. Diese Flexibilität erhöht die Vielseitigkeit und Wiederverwendbarkeit unserer Datenbankinteraktionen.

Das obige ist der detaillierte Inhalt vonWie verwende ich Reflection, um eine Variadic-Funktion „Rows.Scan()' aufzurufen?. 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