Nếu bạn có một bản đồ với các tên và giá trị trường như thế này:
m := map[string]interface{}{"UserID": 1234, "Age": 18}
thì bạn có thể tạo truy vấn như sau:
var values []interface{}
var where []string
for _, k := range []string{"userId", "gender", "age", "name", "height", "weight", "ethnicity"} {
if v, ok := m[k]; ok {
values = append(values, v)
where = append(where, fmt.Sprintf("%s = ?", k))
}
}
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...)
Điều này không dễ bị chèn SQL vì trình giữ chỗ được sử dụng cho các phần của truy vấn nằm ngoài sự kiểm soát trực tiếp của ứng dụng.
Nếu các khóa bản đồ được biết là tên trường được phép, thì hãy sử dụng điều này:
var values []interface{}
var where []string
for k, v := range m {
values = append(values, v)
where = append(where, fmt.Sprintf("%s = ?", k))
}
r, err := db.QueryRow("SELECT name FROM users WHERE " + strings.Join(where, " AND "), values...)