Es gibt jedoch eine Lösung. Erstens, weil wir nur können einen einzigen explodierenden Parameter haben und keine anderen, sollten wir zuerst unsere Parameter in einem einzigen []slice
zusammenfassen :
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Da die SQL nicht von selbst erweitert wird, erweitern wir diese Schleife:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Unter der Annahme von SubTypes
enthält []int{1,2,3}
, inCondition
sollte jetzt ?, ?, ?
enthalten .
Wir kombinieren das dann mit unserer SQL-Anweisung und explodieren das Argument:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Natürlich wäre es ziemlich cool, wenn Sie einfach []slice
übergeben könnten s zu Ihren vorbereiteten Anweisungen und die automatisch erweitert. Dies kann jedoch zu unerwarteten Ergebnissen führen, wenn Sie es mit mehr „unbekannten“ Daten zu tun haben.