Existuje však řešení. Za prvé, protože můžeme pouze mít jeden explodující parametr a žádné další, měli bychom nejprve dát dohromady naše parametry do jednoho []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Protože se SQL nerozšíří samo o sobě, rozšiřme tuto smyčku:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Za předpokladu SubTypes
obsahuje []int{1,2,3}
, inCondition
by nyní měl obsahovat ?, ?, ?
.
Potom to zkombinujeme s naším příkazem SQL a rozložíme argument:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Samozřejmě by bylo skvělé, kdybyste mohli jednoduše předat []slice
s na vaše připravené výpisy a automaticky se rozbalí. To však může přinést neočekávané výsledky, pokud pracujete s více „neznámými“ daty.