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".