Въпреки това има решение. На първо място, тъй като можем само имаме един-единствен експлодиращ параметър и никакви други, първо трябва да съберем нашите параметри в един []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Тъй като SQL няма да се разшири сам, нека разширим този цикъл:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Ако приемем SubTypes
съдържа []int{1,2,3}
, inCondition
сега трябва да съдържа ?, ?, ?
.
След това комбинираме това с нашия SQL израз и експлодираме аргумента:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Разбира се, би било много готино, ако можете просто да предадете []slice
s към вашите подготвени изявления и автоматично разширен. Но това може да даде някои неочаквани резултати, ако имате работа с повече „неизвестни“ данни.