Heim > Backend-Entwicklung > Golang > Wie kann ich Go Reflection effizient nutzen, um die variadische Funktion „Scan' mit einer dynamischen Anzahl von Zeigern aufzurufen?

Wie kann ich Go Reflection effizient nutzen, um die variadische Funktion „Scan' mit einer dynamischen Anzahl von Zeigern aufzurufen?

Susan Sarandon
Freigeben: 2024-12-10 00:21:14
Original
850 Leute haben es durchsucht

How Can I Efficiently Use Go Reflection to Call the `Scan` Variadic Function with a Dynamic Number of Pointers?

Aufrufen der Scan Variadic-Funktion mit Reflection in Go

Die Scan()-Methode der Row-Schnittstelle im Datenbank-/SQL-Paket ermöglicht den effizienten Abruf von Werte aus einer Datenbankzeile durch Übergabe einer variablen Liste von Zeigern auf Werte des richtigen Typs. Obwohl es nützlich ist, mit dieser Methode unter Verwendung von Reflektion zu arbeiten, um Werte aus einer variablen Anzahl von Zeigern zu erhalten, kann es eine Herausforderung sein.

Lösung

Die bereitgestellte Lösung überwindet diese Herausforderung durch dynamische Erstellung zwei Slices: eines zum Speichern von Werten und eines zum Halten paralleler Zeiger. Die Verwendung von Zeigern zum Sammeln von Daten im Werte-Slice ermöglicht das Auffüllen anderer Datenstrukturen.

Code

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

Der Code öffnet zunächst eine Verbindung zur Datenbank und führt sie aus eine Abfrage. Anschließend wird die Anzahl der Spalten in der Ergebnismenge ermittelt und zwei Slices, „values“ und „valuePtrs“, mit der gleichen Länge wie die Spalten erstellt.

Innerhalb der Schleife über die Zeilen wird das „valuePtrs“-Slice mit den Adressen von gefüllt jedes Element im Werte-Slice. Die rows.Scan()-Methode wird dann mit dem valuePtrs-Slice aufgerufen, wodurch das Werte-Slice effektiv mit den Daten aus der aktuellen Zeile gefüllt wird.

Schließlich iteriert der Code über die Spaltennamen und -werte und konvertiert Byte-Slices in ggf. Zeichenfolgen hinzufügen und die Ergebnisse ausdrucken.

Das obige ist der detaillierte Inhalt vonWie kann ich Go Reflection effizient nutzen, um die variadische Funktion „Scan' mit einer dynamischen Anzahl von Zeigern 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage