我正在使用 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")
}
- 1 回答
- 0 关注
- 200 浏览
添加回答
举报
0/150
提交
取消