No entanto, existe uma solução. Em primeiro lugar, já que podemos somente tiver um único parâmetro de explosão e nenhum outro, devemos primeiro reunir nossos parâmetros em um único
[]slice
:var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Como o SQL não expandirá sozinho, vamos expandir esse loop:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Assumindo
SubTypes
contém []int{1,2,3}
, inCondition
agora deve conter ?, ?, ?
. Em seguida, combinamos isso com nossa instrução SQL e explodimos o argumento:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Claro, seria muito legal, se você pudesse simplesmente passar
[]slice
s para suas declarações preparadas e o expandido automaticamente. Mas isso pode dar alguns resultados inesperados se você estiver lidando com mais dados 'desconhecidos'.