Maison >développement back-end >Golang >Comment utiliser Reflection pour appeler une fonction variadique « Rows.Scan() » ?

Comment utiliser Reflection pour appeler une fonction variadique « Rows.Scan() » ?

DDD
DDDoriginal
2024-11-30 12:51:12204parcourir

How to Use Reflection to Call a Variadic `Rows.Scan()` Function?

Comment utiliser la réflexion pour appeler la fonction variadique de 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!

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