Se você tiver um mapa com os nomes e valores dos campos como este:
m := map[string]interface{}{"UserID": 1234, "Age": 18}
então você pode construir a consulta assim:
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...)
Isso não é suscetível à injeção de SQL porque os espaços reservados são usados para partes da consulta fora do controle direto do aplicativo.
Se as chaves do mapa são conhecidas por serem nomes de campo permitidos, use isto:
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...)