为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 中将变量 []interface{} 转换为变量 ...interface{}

在 go 中将变量 []interface{} 转换为变量 ...interface{}

Go
慕桂英4014372 2022-01-10 17:46:56
我正在使用 go mysql 库来执行多个数据库任务。鉴于我想在 mysql 库上编写一个包装器包,我发现自己陷入了以下情况:我有一个具有以下签名的方法:func(db *MySQL) Insert(query string, args ...interface{}) (int64, error)此方法db.Exec从具有以下签名的库中调用函数:func (db *DB) Exec(query string, args ...interface{}) (Result, error)似乎当我调用我的方法时Insert("some query", 1, "test"),它values ...interface{}被转换为[]interface{}与 Exec 函数参数不兼容的类型args ...interface{}。Q1:通过了解这种情况并考虑到我无法修改Exec函数的签名,我怎么可能args从我的Insert函数转移到Exec函数?我已经尝试了几件事来实现这一点,但似乎我无法实现,也找不到将我的参数放入该函数调用的方法。Q2:这甚至可以在不修改签名的情况下实现Exec吗?编辑:这是我试图用上述功能实现的一个例子:func(db *MySQL) Insert(query string, values ...interface{}) (int64, error) {    /**     * TODO: find a way to implement the args slice     * to implement this remember that behind Exec(_, values) there is a [] interface{} element     * which will decompose this element inside. so by passing a values ...interface{} function won't work     * as the values ...interface{} has another data type structure in the end     */    //    if res, err := db.dbConn.Exec(query, values); err != nil {        return -1, err    } else {        if lastId, err := res.LastInsertId(); err != nil {            return -1, err        } else {            return lastId, nil        }    }}
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

据我了解,您的问题是,当您使用相同的参数调用ExecfromInsert时,它认为[]interface{}是interface{}. 在 golang 中,您可以使用 operator 扩展切片...。这样您就可以将参数从Insertto传递给Exec.


func exec(args ...interface{}) {

    fmt.Println(args)

}


func insert(args ...interface{}) {

    exec(args)      // Prints [[5 42]]

    exec(args...)   // Prints [5 42]

}


func main() {

    insert(5, "42")

}


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信