Det finns dock en lösning. Först och främst eftersom vi bara kan har en enda exploderande parameter och inga andra, bör vi först sätta ihop våra parametrar i en enda []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Eftersom SQL inte kommer att expandera av sig själv, låt oss utöka den slingan:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Förutsatt SubTypes
innehåller []int{1,2,3}
, inCondition
ska nu innehålla ?, ?, ?
.
Vi kombinerar sedan det till vår SQL-sats och exploderar argumentet:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Naturligtvis skulle det vara ganska coolt om du bara kunde skicka []slice
s till dina förberedda uttalanden, och den automatiskt utökade. Men det kan ge några oväntade resultat om du har att göra med mer "okända" data.