Als u een kaart heeft met de veldnamen en waarden als volgt:
m := map[string]interface{}{"UserID": 1234, "Age": 18}
dan kun je de query als volgt bouwen:
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...)
Dit is niet gevoelig voor SQL-injectie, omdat tijdelijke aanduidingen worden gebruikt voor delen van de query die buiten de directe controle van de toepassing vallen.
Als bekend is dat de kaartsleutels toegestane veldnamen zijn, gebruik dan dit:
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...)