Comunque, c'è una soluzione. Innanzitutto, poiché possiamo solo hanno un singolo parametro di esplosione e nessun altro, dovremmo prima mettere insieme i nostri parametri in un unico []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Poiché l'SQL non si espanderà da solo, espandiamo quel ciclo:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Assumendo SubTypes
contiene []int{1,2,3}
, inCondition
ora dovrebbe contenere ?, ?, ?
.
Quindi lo combiniamo alla nostra istruzione SQL ed esplodiamo l'argomento:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Certo, sarebbe fantastico se potessi semplicemente passare []slice
s alle tue dichiarazioni preparate e automaticamente ampliato. Ma ciò potrebbe dare risultati inaspettati se hai a che fare con dati più "sconosciuti".