我知道对于字符串数组[]string
我可以使用strings.Join(a []string, ',')
但我想对整数数组[]int
做同样的事情。
对于variants
为[]map[string]int
var Ids []int
sqlStr := "select id from mapping where my_id in ("
for _, mp := range variants {
sqlStr += "?,"
Ids = append(Ids, mp["id"])
}
sqlStr = strings.TrimRight(sqlStr, ",")
rows, err := db.Query(sqlStr+")", strings.Join(Ids, ',')) // I can't do this because Join needs String array
如何实现这一目标?
答案 0 :(得分:4)
将IDs
设为[]string
并在追加它们时转换整数
var IDs []string
for _, i := range []int{1, 2, 3, 4} {
IDs = append(IDs, strconv.Itoa(i))
}
fmt.Println(strings.Join(IDs, ", "))
答案 1 :(得分:1)
这是一种有效的方法:
func sqlIntSeq(ns []int) string {
if len(ns) == 0 {
return ""
}
// Appr. 3 chars per num plus the comma.
estimate := len(ns) * 4
b := make([]byte, 0, estimate)
// Or simply
// b := []byte{}
for _, n := range ns {
b = strconv.AppendInt(b, int64(n), 10)
b = append(b, ',')
}
b = b[:len(b)-1]
return string(b)
}
您可以在SQL查询中使用它:
query := `SELECT * FROM table WHERE id IN (` + sqlIntSeq(ids) + `)`
答案 2 :(得分:1)
我更愿意使用json.Marshal
。它非常简单易用。
data := []int{100, 200, 300}
s, _ := json.Marshal(data)
fmt.Println(strings.Trim(string(s), "[]"))
希望这对您有所帮助。如有疑问,请随时提问。 WebsiteLink