首页 > 文章列表 > 可变参数传递给func的方法

可变参数传递给func的方法

234 2024-02-06
问题内容

sql 库函数 querycontext 采用 where 子句的可变参数。我想创建一个辅助函数,它接受可变参数并将其发送到 querycontext 调用。

这是我的代码片段:

func genericdbselect(ctx context.context, qry string, params ...string) (*sql.rows, error) {
    // format the connectstr
    db, err := sql.open("mysql", connectstr)

    if err != nil || db == nil {
        msg := "could not get db connection. is db available?"
        return nil, fmt.errorf(msg)
    }

    rows, err := db.querycontext(ctx, qry, params)

    if err != nil {
        msg := fmt.sprintf("could not prep query = %v, params = %v. error = %v ", qry, params, err)
    
        return nil, fmt.errorf(msg)
    }

    return rows, err
}

我这样称呼它:

rows, err := genericdbselect(ctx, qry, param1, param2)

当我运行此代码时,它会抛出以下错误:

SQL: converting argument $1 type: unsupported type []string, a slice of string

问题似乎是 genericdbselect 中的参数被接收为 []string 而不是 ...string。


正确答案


进行以下两项更改:

  • 声明 genericdbselect 以采用与 querycontext 相同类型的可变参数。这允许 params 无需转换即可传递。

    func genericdbselect(ctx context.context, 
           qry string, params ...any) (*sql.rows, error) {
  • 使用 ... 语法将可变参数传递给 querycontext:

    rows, err := db.QueryContext(ctx, qry, params...)

请参阅将参数传递给...参数了解更多信息。