当前位置: 首页 > 面试题库 >

如何使用反射调用扫描可变参数函数

巫马泓
2023-03-14
问题内容

我想使用反射调用Rows.Scan()函数。但是,它需要使用可变数量的指针,但是没有很多源示例。我需要使用反射,因为我计划用Query调用中的值填充一个切片。因此,基本上使用rows.Columns()来获取行的长度,然后make()使用来切片[]interface{}以填充通常使用传递给Scan()函数的指针填充的数据点。

基本上像这样的代码:

col := rows.Columns()
vals := make([]interface{}, len(cols))
rows.Scan(&vals)

有人举过一个调用可变参数函数的例子,该函数使用我可以查看的反射来获取指针?

编辑:似乎没有做我想要的示例代码。

package main

import (
    _ "github.com/lib/pq"
    "database/sql"
    "fmt"
)


func main() {

    db, _ := sql.Open(
        "postgres",
        "user=postgres dbname=Go_Testing password=ssap sslmode=disable")

    rows, _ := db.Query("SELECT * FROM _users;")

    cols, _ := rows.Columns()

    for rows.Next() {

        data := make([]interface{}, len(cols))

        rows.Scan(data...)

        fmt.Println(data)
    }

}

结果:

[<nil> <nil> <nil> <nil> <nil>]
[<nil> <nil> <nil> <nil> <nil>]
[<nil> <nil> <nil> <nil> <nil>]
[<nil> <nil> <nil> <nil> <nil>]
[<nil> <nil> <nil> <nil> <nil>]
[<nil> <nil> <nil> <nil> <nil>]

问题答案:

这是我到达的解决方案。它在遍历数据之前没有获得Types,因此在将值拉出之前不事先知道每个值的类型Scan(),但真正的重点是不必事先知道类型。

诀窍是创建2个切片,一个切片用于值,另一个切片使指针平行于值切片。然后,一旦使用了指针填充数据,值数组实际上就会被数据填充,然后可用于填充其他数据结构。

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


 类似资料:
  • 问题内容: 简单的问题,如何使此代码起作用? 输出: 问题答案: 作品。问题在于仅搜索方法。从javadoc: 返回一个Method对象,该对象反映此Class对象表示的类或接口的指定公共成员方法。 更新: 成功获取方法后,可以使用以下方法调用它: 即- 用一个元素创建一个新数组-该数组。使用变量名,它看起来像:

  • 问题内容: 我正在尝试使用java反射调用带有可变参数的方法。这是托管方法的类: 这是调用代码: 我在调用invoke的最后一行以“错误数量的参数” 的形式获取IllegalArgumentException 。不知道我在做什么 错。 任何指针将不胜感激。 谢谢 问题答案: public class Test { 为我工作。 将您的N []投射到对象 在实例上调用,而不在类上调用

  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 我有一个内联变量函数内联int foo(…) 我需要调用一个宏(我们称它为宏),它也是可变的 基本上,我需要将其所有输入参数传递给宏。由于使用了选项,将重新定义为另一个宏将是一个简单的解决方案,但我还需要来返回值<注意:我正在尝试连接已编写代码的两部分,不允许更改它们<代码>foo(…) 用于代码的第一部分,宏定义于第二部分。我要做的唯一一件事就是定义一个使用宏的foo(),我不能,因为它们都是可

  • 本文向大家介绍Swift如何调用Objective-C的可变参数函数详解,包括了Swift如何调用Objective-C的可变参数函数详解的使用技巧和注意事项,需要的朋友参考一下 前言 这个问题是一个朋友问我怎么写,一开始我是拒绝的。我想这种东西网上随便 google 下不就有了吗。他说,查了,但没大看明白。于是我就查了下,没想到这个写法确实有点诡异,我第一反应也没看明白。所以随便水一篇文章,强行

  • 我有以下代码: 我要复制的类: 创建一些类 公共对象createObj(String cls\u name,String param1,int param2){返回Class.forName(cls\u name)。getConstructor(String.Class,Integer.Class)。newInstance(param1,param2);} 然后我尝试使用以下内容复制该类的对象: