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.