Tuy nhiên, có một giải pháp. Trước hết, vì chúng ta có thể chỉ có một tham số phát nổ duy nhất và không có tham số khác, trước tiên chúng ta nên đặt các tham số của mình lại với nhau trong một []slice
duy nhất :
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Vì SQL sẽ không tự mở rộng, hãy mở rộng vòng lặp đó:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Giả sử SubTypes
chứa []int{1,2,3}
, inCondition
bây giờ nên chứa ?, ?, ?
.
Sau đó, chúng tôi kết hợp điều đó với câu lệnh SQL của mình và làm bùng nổ đối số:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Tất nhiên, sẽ khá tuyệt, nếu bạn chỉ cần vượt qua []slice
s cho các câu lệnh đã chuẩn bị của bạn và được tự động mở rộng. Nhưng điều đó có thể mang lại một số kết quả không mong muốn nếu bạn đang xử lý nhiều dữ liệu 'không xác định' hơn.