Maison >développement back-end >Golang >Comment appeler dynamiquement Variadic Rows.Scan() à l'aide de Reflection in Go ?

Comment appeler dynamiquement Variadic Rows.Scan() à l'aide de Reflection in Go ?

DDD
DDDoriginal
2024-12-04 00:58:13960parcourir

How to Dynamically Call Variadic Rows.Scan() Using Reflection in Go?

Appel de fonctions variadiques avec Reflection pour SQL Scan

Lors de l'utilisation de la fonction Rows.Scan() pour les requêtes de base de données SQL, il devient nécessaire de utilisez la réflexion pour tenir compte du nombre variable de pointeurs qu'il accepte. Cela permet de remplir dynamiquement des tranches avec les données d'un résultat de requête.

Étapes pour analyser dynamiquement à l'aide de la réflexion

Pour appeler une fonction variadique telle que Rows.Scan() à l'aide de la réflexion , suivez ces étapes :

  1. Obtenir les informations sur la colonne : Utiliser rows.Columns() pour récupérer les noms des colonnes.
  2. Créer des tranches : Créez deux tranches : une pour les valeurs (values) et une pour les pointeurs (valuePtrs), toutes deux correspondant à la longueur des colonnes. .
  3. Analyser les données : Dans la boucle pour chaque ligne de l'ensemble de résultats, parcourez chaque colonne et attribuez pointeurs vers la tranche valuePtrs. Ensuite, invoquez rows.Scan(valuePtrs...).
  4. Récupérer les valeurs : Après l'analyse, les données seront disponibles dans la tranche de valeurs. Convertissez le []byte en chaînes si nécessaire.

Exemple de code

L'extrait de code suivant montre comment analyser dynamiquement à l'aide de la réflexion :

package main

import (
    "fmt"
    _ "github.com/lib/pq"
    "database/sql"
)

func main() {
    db, _ := sql.Open("postgres", "connection_string")
    rows, _ := db.Query("SELECT * FROM my_table")

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

En implémentant cette méthode, vous pouvez remplir dynamiquement les tranches avec les résultats de la requête sans spécifier les types de données à l'avance.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn