次のようなフィールド名と値を持つマップがある場合:
m := map[string]interface{}{"UserID": 1234, "Age": 18}
次に、次のようにクエリを作成できます:
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...)
プレースホルダーはアプリケーションの直接制御外のクエリの一部に使用されるため、これはSQLインジェクションの影響を受けません。
マップキーにフィールド名が許可されていることがわかっている場合は、次を使用します。
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...)