无法将args(类型[] string)用作类型[] interface {}

内存 :

我的golang sqlite插入函数。我正在使用这个包裹"github.com/mattn/go-sqlite3"

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(类型[] string)作为类型[] interface {}

mkopriva:

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

https://golang.org/doc/faq#convert_slice_of_interface


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

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包装不正确。从该包的函数/方法返回的许多对象都需要关闭以释放基础资源。

因为这是真正的*sql.DB由归国Open*sql.Stmt由归国Prepare*sql.Rows由返回Query

因此,您的函数应该看起来更像这样:

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每次需要与数据库对话时使用新实例。

从Open的文档中:

返回的数据库可安全地供多个goroutine并发使用,并维护其自己的空闲连接池。因此,Open函数应仅被调用一次。几乎不需要关闭数据库。

如果您继续按照自己的方式进行操作,则DB每次调用Insert或需要与之通信的任何其他函数时都打开一个新文件,则该DB程序的性能将比仅使用一个DB函数并重用该函数的情况差。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法从[[] interface {}`断言类型[[] string`

“无法将myType用作类型接口{}”吗?我以为Go中所有类型都算作interface {}?

转到:强制转换类型无法将map [string] interface {}映射到map [string] string

无法将类型'Task <Derived>'转换为'Task <Interface>'

使用map [string] int作为map [interface {}] interface {}类型的参数

无法将([] byte类型)用作io.Reader类型

打字稿错误-类型'string []'不能用作索引类型

Gotest-无法在字段值中将[] int文字(类型[] int)用作args类型

将interface {}转换为特定类型

[] interface {}的元素类型

类型化的嵌套映射map [string] interface {}返回“类型interface {}不支持索引”

将Self用作通用类型

如何将map [string] interface {}中的不同值转换为string类型

不能将temp(类型接口{})用作equalStringArray的参数中的类型[] string:需要类型断言

无法将字符串类型用作sql.NullString

传播时“无法将[] struct类型的变量用作[]接口”

是否可以将无法访问的类型用作模板参数?

无法将导入的类用作TypeScript中的返回类型

无法将类型的对象用作array_push上的数组

无法将stdClass类型的对象用作数组Laravel错误

无法将F#类型用作C#函数参数

无法将stdClass类型的对象用作CodeIgniter中的数组

无法将类型为stdClass的对象用作数组

无法将类型为stdClass的对象用作数组

gob:类型未注册的接口:map [string] interface {}

在Golang中访问类型为map [string] interface {}的嵌套地图

外部类型问题的JSON序列化-将map [string] interface {}项转换为int

PureScript - 无法将 Maybe String 类型与 String 类型匹配

无法将预期类型“IO [String]”与实际类型“[String]”匹配