Maison >développement back-end >Golang >Comment puis-je utiliser efficacement Go Reflection pour appeler la fonction variadique « Scan » avec un nombre dynamique de pointeurs ?

Comment puis-je utiliser efficacement Go Reflection pour appeler la fonction variadique « Scan » avec un nombre dynamique de pointeurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-10 00:21:14850parcourir

How Can I Efficiently Use Go Reflection to Call the `Scan` Variadic Function with a Dynamic Number of Pointers?

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!

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