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!