"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo usar la reflexión para llamar a la función variádica de la base de datos/sql.scan ()?

¿Cómo usar la reflexión para llamar a la función variádica de la base de datos/sql.scan ()?

Publicado el 2025-02-06
Navegar:889

How to Use Reflection to Call the Database/SQL Rows.Scan() Variadic Function?

llamando a la función variadic de scan () con reflexión

la función Rows.scan () proporciona una forma conveniente de recuperar datos de una base de datos de una base de datos consulta. Sin embargo, utiliza un número variable de punteros como sus argumentos, que pueden ser difíciles de incorporar el uso de la reflexión. Considere el siguiente escenario:

desea completar dinámicamente un corte con los valores obtenidos de una consulta y utilizar shows.scan () para extraer los datos. En este caso, deberá determinar el número de columnas y crear una porción para almacenar los valores.

una pitfall común:
un intento de usar la reflexión para llamar al La función Scan () puede conducir a resultados inesperados. Esto se debe a que shows.scan () espera punteros a los valores, y simplemente pasar una porción de interfaz {} valores daría como resultado referencias nil.

la solución:

Para llamar con éxito a Scan () con reflexión, se emplea un enfoque de dobleille. El primer corte, los valores, contiene los datos reales, mientras que el segundo corte, valuePTRS, contiene punteros a cada elemento en los valores.

para cada columna en el resultado de la consulta, un puntero en valores se asigna al elemento correspondiente en valores. Posteriormente, ROWS.Scan () se puede invocar con valores de valores como su argumento, llenando efectivamente los valores.

Ejemplo de trabajo:

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)
    valuesPtrs := make([]interface{}, count)

    for rows.Next() {
        for i := range columns {
            valuesPtrs[i] = &values[i]
        }

        rows.Scan(valuesPtrs...)

        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 este ejemplo, Rows.Scan () se invoca con los valores de Puntinter Slice, que estampan el corte de valores con los datos recuperados. El bucle luego imprime cada nombre de la columna y su valor correspondiente.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3