Я изучаю Go и пытаюсь создать конечную точку API с параметром 'fields'.Когда я пытаюсь отсканировать получаемые строки sqlx, он превращается в структуру, однако пропущенные пользователем поля возвращаются как пустая строка.Есть ли способ, которым я могу изменить структуру, чтобы отражать только поля, которые пользователь передал?Я не думаю, что хочу использовать omitempty
в случае, например, user_name - пустая строка.
type User struct {
Id int `db:"id"`
UserName string `db:"user_name"`
}
func GetUsers(w http.ResponseWriter,r *http.Request,db *sqlx.DB) {
acceptedFields := map[string]bool {
"id":true,
"user_name":true,
}
var requestedFields string = "id"
if r.URL.Query().Get("fields") != ""{
requestedFields = r.URL.Query().Get("fields");
}
for _, requestedField := range strings.Split(requestedFields,",") {
if !acceptedFields[requestedField] {
http.Error(w, fmt.Sprintf("Unknown Field '%s'",requestedField), http.StatusBadRequest)
}
}
users := []User{}
err := db.Select(&users,fmt.Sprintf("SELECT %s FROM users",requestedFields));
if err != nil {
log.Fatal(err)
}
response, _ := json.Marshal(users)
fmt.Fprintf(w,string(response))
}
Результирующий вывод конечной точки
/users?fields=id
=> [{"Id":12,"UserName":""}]
Требуемый выход конечной точки
/users?fields=id
=> [{"Id":12}]
Также использование sql.NullString приводит к следующему:
[{"Id":12,"UserName":{"String":"","Valid":false}}]