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

Comment puis-je utiliser Reflection pour appeler la fonction variadique « Rows.Scan() » dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-29 16:36:18632parcourir

How Can I Use Reflection to Call the Variadic `Rows.Scan()` Function in Go?

Appel de la fonction d'analyse variadique à l'aide de la réflexion

Pour appeler la fonction Rows.Scan() à l'aide de la réflexion, vous pouvez exploiter la puissance de la réflexion pour passer un nombre variable de pointeurs vers la fonction. Ceci est particulièrement utile lorsque vous souhaitez remplir une tranche avec les valeurs d'un résultat de requête de base de données.

Étapes à mettre en œuvre

  1. Récupérer les noms de colonnes de la requête résultat en utilisant rows.Columns(). Cela vous donnera la longueur de la ligne.
  2. Créez une tranche de []interface{} pour stocker les points de données, et une autre tranche de pointeurs pour stocker les adresses de ces points de données.
  3. Appelez la méthode Reflect.ValueOf sur la tranche de pointeurs pour obtenir un objet Reflect.Value.
  4. Utilisez la méthode Addr pour obtenir une tranche de valeurs qui représentent les adresses des points de données.
  5. Appelez les lignes.Scannez et transmettez-lui la tranche d'adresses comme arguments.
  6. Après avoir appelé Scan, la tranche de []interface{} sera remplie avec les points de données.

Exemple de code

package main

import (
    "fmt"
    "reflect"
    "database/sql"
)

func main() {
    // Open a database connection.
    db, _ := sql.Open("postgres", "user=postgres dbname=database password=password")

    // Query the database.
    rows, _ := db.Query("SELECT * FROM table_name")

    // Get the column names.
    columns, _ := rows.Columns()
    columnCount := len(columns)

    // Create slices to store data points and pointers.
    data := make([]interface{}, columnCount)
    dataPtrs := make([]interface{}, columnCount)

    // Obtain a slice of pointers.
    pointers := reflect.ValueOf(dataPtrs)

    // Obtain a slice of addresses.
    addresses := pointers.Addr()

    // Fill the data points by calling Rows.Scan().
    rows.Scan(addresses...)

    // Print the data points.
    for i := 0; i < columnCount; i++ {
        fmt.Println(columns[i], data[i])
    }
}

Cet extrait de code montre comment utilisez la réflexion pour appeler la fonction Rows.Scan() avec un nombre variable de pointeurs. Il récupère dynamiquement les noms de colonnes du résultat de la requête et crée des tranches pour stocker les points de données et les pointeurs. En utilisant la réflexion pour obtenir la tranche d'adresses, vous pouvez la transmettre aux lignes. Scannez et remplissez les points de données en conséquence.

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