首页 >后端开发 >Golang >如何高效地使用 Go 反射来调用具有动态数量指针的'Scan”可变参数函数?

如何高效地使用 Go 反射来调用具有动态数量指针的'Scan”可变参数函数?

Susan Sarandon
Susan Sarandon原创
2024-12-10 00:21:14852浏览

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

Go 中通过反射调用 Scan Variadic 函数

database/sql 包中 Row 接口的 Scan() 方法可以高效检索通过将指针的可变参数列表传递给正确类型的值来获取数据库行中的值。虽然很有用,但使用反射从可变数量的指针获取值的方法可能具有挑战性。

解决方案

提供的解决方案通过动态创建来克服这一挑战两个切片:一个用于存储值,另一个用于保存并行指针。使用指针收集值切片中的数据可以填充其他数据结构。

代码

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

代码首先打开与数据库的连接并执行一个查询。然后,它确定结果集中的列数,并创建两个切片:values 和 valuePtrs,其长度与列相同。

在行循环内,valuePtrs 切片填充为值切片中的每个元素。然后使用 valuePtrs 切片调用 rows.Scan() 方法,有效地使用当前行的数据填充值切片。

最后,代码迭代列名称和值,将字节切片转换为如果需要的话字符串,并打印结果。

以上是如何高效地使用 Go 反射来调用具有动态数量指针的'Scan”可变参数函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn