हालाँकि, एक समाधान है। सबसे पहले, चूंकि हम केवल . कर सकते हैं एक एकल विस्फोट पैरामीटर है और कोई अन्य नहीं, हमें पहले अपने मापदंडों को एक []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
. पास कर सकते हैं आपके तैयार किए गए बयानों के लिए, और स्वचालित रूप से विस्तारित। लेकिन अगर आप अधिक 'अज्ञात' डेटा के साथ काम कर रहे हैं तो यह कुछ अप्रत्याशित परिणाम दे सकता है।