Maison >développement back-end >Golang >Comment utiliser Reflection pour appeler une fonction variadique « Rows.Scan() » ?
Lors de l'utilisation des résultats de la base de données, il peut être nécessaire d'appeler la fonction Rows.Scan() en utilisant la réflexion. Cependant, cela peut constituer un défi en raison du nombre variable de pointeurs requis par la fonction. Dans cet article, nous examinerons une solution pratique qui répond à ce besoin.
En utilisant la réflexion, nous visons à remplir une tranche avec des valeurs obtenues à partir d'une requête de base de données. Le processus consiste à déterminer le nombre de colonnes et à allouer une tranche d'interfaces vides pour contenir les points de données. Cette approche offre une flexibilité dans la gestion des valeurs sans connaissance préalable de leurs types.
Exemple de code et de mise en œuvre
Le code suivant illustre la mise en œuvre de cette approche :
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) } } }
Clé du succès
La clé de cette approche réside dans l'emploi de deux tranches : l'un stocke les valeurs et l'autre contient des pointeurs correspondant à chaque valeur. Une fois les pointeurs utilisés, la tranche de valeurs est remplie avec les données, donnant accès aux points de données réels pour un traitement ultérieur.
En tirant parti de la réflexion, nous donnons à notre code la capacité de gérer des valeurs dont les types sont pas connu à l'avance. Cette flexibilité améliore la polyvalence et la réutilisabilité de nos interactions avec nos bases de données.
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!