另一种解决方案是
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])
但它相当冗长,当切片长度发生变化时需要额外的工作。
请注意,如果我们使用intvars := []int {1, 2, 3, 4} 而不是interface 切片somevars 并在db.Query() 中扩展intvars,编译器将报错intvars...
不能在赋值中使用 []int 字面量(类型 []int)作为类型 []interface {}
类型转换intvars.([]interface{}) 也不起作用。这记录在language spec FAQ 中。还有一个dedicated wiki page for it
语言规范不允许这样做,因为这两种类型在内存中的表示形式不同。
golanginterface的直观图是一个有两个字段的对象,一个字段存储一个类型,另一个存储一个指针。