问题:
自己使用sqlx操作数据库,想封装一个Insert函数:
func Insert(sql string,args ...interface{}) (int,bool){
ret, err := DataSource.Exec(sql, args) /*这里是错误写法*/
if err!=nil{
return 0,false
}
id, err := ret.LastInsertId()
return int(id),true
}
执行Insert时传入sql和两个参数,sqlx报错:
id, b := datasource.Insert(datasource.INSERT_new_user, phone, nickname)
sql: converting argument $1 type: unsupported type []interface {}, a slice of interface
字面意思是sqlx在解析两个占位符并试图填入参数时,第一个参数类型是空指针的切片,而预期是args这个可变参数中的第一个。
于是了解了一下golang中的可变参数,即…运算符
当...Type作为参数时,本质上函数会把参数转化成一个Type类型的切片,于是在上述代码中,Service层调以可变参数形式传入两个参数,在Insert中的args就已经是[]interface{}类型了,如果直接把args作为func (db *DB) Exec(query string, args ...interface{}) (Result, error)的参数,对于Exec来说,收到的args就只有一个长度为1的切片,其元素类型为[]interface{},于是就有了上述的报错,解决办法很简单,就是在一个slice后加上...,这样就能把它拆包成一个可变参数的形式传入函数。
文章开始的代码进行如下修改:
ret, err := DataSource.Exec(sql, args) /*这里是错误写法*/
↓
ret, err := DataSource.Exec(sql, args...) /*这里是正确写法*/
版权声明:本文为qq_44336275原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。