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
Susan SarandonOriginal
2024-12-10 00:21:14849Durchsuche

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

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!

Stellungnahme:
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