Er is echter een oplossing. Ten eerste, omdat we alleen een enkele exploderende parameter hebben en geen andere, moeten we eerst onze parameters samenvoegen in een enkele []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Aangezien de SQL niet vanzelf uitbreidt, laten we die lus uitbreiden:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Uitgaande van SubTypes
bevat []int{1,2,3}
, inCondition
moet nu ?, ?, ?
. bevatten .
We combineren dat vervolgens met onze SQL-instructie en exploderen het argument:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Het zou natuurlijk best gaaf zijn als je gewoon []slice
zou kunnen doorgeven s naar uw voorbereide verklaringen, en de automatisch uitgevouwen. Maar dat kan onverwachte resultaten opleveren als je te maken hebt met meer 'onbekende' gegevens.