拥有这个:
somevars := []int{1, 2, 3, 4}
rows, err = db.Query("SELECT c1,c2 FROM table"+tid+" WHERE c1 IN($1,$2,$3,$4);", somevars)
明白啦:
sql:转换参数$ 1类型:unsupported type [] int,一个int片
任何使用lib / pq进行切片的方法都可以吗?
另一种解决方案是
somevars := []interface{}{1, 2, 3, 4}
rows, err = db.Query(
"SELECT c1,c2 FROM table"+tid+" WHERE c1 IN($1,$2,$3,$4);",
somevars...)
在这里,...
将切片扩展为多个参数,类似于python *args
。它记录了in the language spec。
db.Query
API支持这种所谓的可变参数。
func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
这里interface{}
被称为空接口,它可以保存任何类型的值。见Go tour example here。所以可以像使用它一样
db.Query(stmt, var1, var2)
其中var1
var2
可能是不同类型的。
在您的情况下,您还可以显式传递切片元素
db.Query(stmt,
somevars[0], somevars[1], somevars[2], somevars[3])
但它相当冗长,并且在切片长度变化时需要额外的工作。
请注意,如果不使用interface
切片somevars
,我们使用intvars := []int {1, 2, 3, 4}
并在intvars
中展开db.Query()
,编译器会抱怨intvars...
不能在赋值时使用[] int literal(type [] int)作为类型[] interface {}
类型转换intvars.([]interface{})
也不起作用。这在language spec FAQ中有记载。还有一个dedicated wiki page for it
语言规范不允许它,因为这两种类型在内存中没有相同的表示。
golang interface
的直观图片是一个有两个字段的对象,一个字段存储一个类型,另一个存储指针。
pq.Array是答案:
somevars := []int{1, 2, 3, 4}
rows, err = db.Query("SELECT c1,c2 FROM table"+tid+" WHERE c1 = any($1);", pq.Array(somevars))