首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将args (类型[]字符串)用作类型[]接口{}

不能将args (类型[]字符串)用作类型[]接口{}
EN

Stack Overflow用户
提问于 2019-09-10 10:07:16
回答 1查看 19.8K关注 0票数 5

我的金刚sqlite插入功能。我用的是这个包"github.com/mattn/go-sqlite3"

代码语言:javascript
复制
func Insert(args ...string)(err error){
  db, err:=sql.Open("sqlite3","sqlite.db")
  if err !=nil {
    return
  }
  q, err := db.Prepare(args[0])
  if err !=nil{
    return
  }
  _,err = q.Exec(args[1:]...)
  return
 }
main (){
  err := Insert("INSERT INTO table(first,last) VALUES(?,?)","Nantha","nk")
  if err !=nil{
  fmt.Println(err.Error())
    return
  }
}

我得到了这个错误

不能在q.Exec参数中使用args (类型[]字符串)作为类型[]接口{}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-10 10:16:03

错误非常明显,函数期望类型为[]interface{},但传递的值为[]string类型。您必须先将[]string转换为[]interface{},然后再将其传递给Exec。这样做的方法是遍历字符串并将每个字符串添加到interface{}的一个新片段中。

interface

作为另一种方法,您可以更改Insert参数类型。

代码语言:javascript
复制
func Insert(query string, args ...interface{}) (err error) {
    db, err := sql.Open("sqlite3", "sqlite.db")
    if err != nil {
        return err
    }
    q, err := db.Prepare(query)
    if err != nil {
        return err
    }
    _, err = q.Exec(args...)
    return err
}

func main() {
    err := Insert("INSERT INTO table(first,last) VALUES(?,?)", "Nantha", "nk")
    if err !=nil{
        fmt.Println(err.Error())
        return
    }
}

请注意,您使用的database/sql包不正确。从该包的函数/方法返回的许多对象需要关闭才能释放底层资源。

这对于Open返回的OpenPrepare返回的*sql.StmtQuery返回的*sql.Rows等都是正确的。

因此,您的函数应该更接近于这样的内容:

代码语言:javascript
复制
func Insert(query string, args ...interface{}) (err error) {
    db, err := sql.Open("sqlite3", "sqlite.db")
    if err != nil {
        return err
    }
    defer db.Close()

    q, err := db.Prepare(query)
    if err != nil {
        return err
    }
    defer q.Close()

    _, err = q.Exec(args...)
    return err
}

还请注意,sql.DB是可重用的,这意味着您不必每次需要与数据库交谈时都需要sql.Open一个新实例。

公开会议上的文档:

返回的DB对于多个goroutines并发使用是安全的,并且维护它自己的空闲连接池。因此,应该只调用一次Open函数。很少有必要关闭DB。

如果您继续这样做,每次调用DB或任何其他需要与DB对话的函数时都会打开一个新的DB,那么您的程序的性能将比只有一个DB并让函数重用时更糟。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57868506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档