type State int8
const (
StateLocked State = iota+1
StateDelete
)
// 实现 query.UnmarshalQueryer 接口
func (s *State) UnmarshalQuery(data string) error {
switch data {
case "locked":
*s = StateLocked
case "delete":
*s = StateDelete
default:
return errors.New("无效的值")
}
}
type struct Query {
Page int `query:"page,1"`
Size int `query:"size,20"`
States []State `query:"state,normal"`
}
func (q *Query) SanitizeQuery(errors map[string]string) {
if q.Page < 0 {
errors["page"] = "不能小于零"
}
// 其它字段的验证
}
func handle(w http.ResponseWriter, r *http.Request) {
q := &Query{}
errors := query.Parse(r, q)
if len(errors) > 0 {
// TODO
return
}
// 请求参数为 /?page=1&size=2&state=normal,delete
// 则 q 的值为
// page = 1
// size = 2
// states = []State{StateLocked, StateDelete}
//
// 参数 state 也可使用以下方式
// /?page=1&size=2&state=normal&normal=delete
}
https://github.com/issue9/query