Namun, ada solusi. Pertama-tama, karena kita hanya memiliki satu parameter exploding dan tidak ada yang lain, pertama-tama kita harus mengumpulkan parameter kita dalam satu []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Karena SQL tidak akan berkembang dengan sendirinya, mari kita perluas loop itu:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Dengan asumsi SubTypes
berisi []int{1,2,3}
, inCondition
sekarang harus berisi ?, ?, ?
.
Kami kemudian menggabungkannya ke pernyataan SQL kami dan meledakkan argumen:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Tentu saja, itu akan sangat keren, jika Anda bisa melewatkan []slice
s ke pernyataan yang Anda siapkan, dan secara otomatis diperluas. Tapi itu mungkin memberikan beberapa hasil yang tidak terduga jika Anda berurusan dengan lebih banyak data 'tidak diketahui'.