我使用的一个包gosqlite有一个带有variadic个参数的方法,其类型是empty interface.
func (s *Stmt) Exec(args ...interface{}) os.Error
如果显式传递单个参数,我可以称之为罚款:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
然而,由于variadic参数对应于SQL语句select
的in
运算符中的占位符,这些占位符的数量在编译时是未知的,但在运行时会根据用户的操作动态变化.例如,如果用户输入四个值,我会使用类似于以下内容的SQL:
SELECT * FROM sky WHERE name IN (?,?,?,?)
因此,我自然会使用一段字符串调用Exec
方法:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
这是不可编译的.我可以通过创建一个空接口片并通过以下方式复制引用来解决这个问题:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not
这个不错,但感觉有点笨重.我想知道是否有什么技巧可以将values
直接传递给此函数,或者,如果没有,是否有更巧妙的方法将字符串片转换为空接口片?
非常感谢.