golang使用sqlx报错:unsupported type []interface {}, a slice of interface

问题:

自己使用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...)	/*这里是正确写法*/		

你可能感兴趣的:(golang,golang,sql)