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

我正在使用 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

        }

    }

}


慕桂英4014372
浏览 201回答 1
1回答

千巷猫影

据我了解,您的问题是,当您使用相同的参数调用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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go