Der er dog en løsning. Først og fremmest, da vi kun kan har en enkelt eksploderende parameter og ingen andre, bør vi først sammensætte vores parametre i en enkelt []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Da SQL'en ikke udvider sig af sig selv, lad os udvide denne løkke:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Forudsat SubTypes
indeholder []int{1,2,3}
, inCondition
skal nu indeholde ?, ?, ?
.
Vi kombinerer det derefter med vores SQL-sætning og eksploderer argumentet:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Det ville selvfølgelig være ret fedt, hvis du blot kunne sende []slice
s til dine forberedte udsagn, og den automatisk udvidede. Men det kan måske give nogle uventede resultater, hvis du har at gøre med flere 'ukendte' data.