Cependant, il existe une solution. Tout d'abord, puisque nous ne pouvons que avoir un seul paramètre qui explose et pas d'autres, nous devons d'abord rassembler nos paramètres dans un seul []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Étant donné que le SQL ne se développera pas de lui-même, développons cette boucle :
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
En supposant des SubTypes
contient []int{1,2,3}
, inCondition
devrait maintenant contenir ?, ?, ?
.
Nous combinons ensuite cela à notre instruction SQL et explosons l'argument :
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Bien sûr, ce serait plutôt cool si vous pouviez simplement passer []slice
s à vos relevés préparés, et le développé automatiquement. Mais cela peut donner des résultats inattendus si vous avez affaire à des données plus "inconnues".