Appel de la fonction Scan Variadic avec Reflection dans Go
La méthode Scan() de l'interface Row dans le package base de données/sql permet une récupération efficace des valeurs d’une ligne de base de données en passant une liste variadique de pointeurs vers des valeurs de type correct. Bien qu'utile, travailler avec cette méthode en utilisant la réflexion pour obtenir des valeurs à partir d'un nombre variable de pointeurs peut s'avérer difficile.
Solution
La solution fournie surmonte ce défi en créant dynamiquement deux tranches : une pour stocker les valeurs et une pour contenir des pointeurs parallèles. L'utilisation de pointeurs pour collecter des données dans la tranche de valeurs permet de peupler d'autres structures de données.
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) } } }
Le code ouvre d'abord une connexion à la base de données et s'exécute une requête. Il détermine ensuite le nombre de colonnes dans le jeu de résultats et crée deux tranches, valeurs et valeurPtrs, de même longueur que les colonnes.
À l'intérieur de la boucle sur les lignes, la tranche valeurPtrs est renseignée avec les adresses de chaque élément de la tranche de valeurs. La méthode rows.Scan() est ensuite appelée avec la tranche valuePtrs, remplissant efficacement la tranche de valeurs avec les données de la ligne actuelle.
Enfin, le code parcourt les noms et les valeurs des colonnes, convertissant les tranches d'octets en chaînes si nécessaire, et impression des résultats.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!