Go言語でクエリパラメータの変換処理を共通化するQueryParserパターン
Go
Gin
知識
原則
Gin フレームワークで複数のクエリパラメータを扱う際、各パラメータごとに変換とエラーハンドリングを書くとコードが冗長になる。QueryParser構造体を使用することで、この処理を効率的に共通化できる。
QueryParserの実装方法:
go
type QueryParser struct {
c *gin.Context
errors []error // エラーを蓄積
}
func NewQueryParser(c *gin.Context) *QueryParser {
return &QueryParser{c: c, errors: []error{}}
}
// 各型に対応したパースメソッドを用意
func (p *QueryParser) ParseUint(key string) *uint
func (p *QueryParser) ParseInt(key string) *int
func (p *QueryParser) ParseDate(key string, layout string) *time.Time
func (p *QueryParser) ParseBool(key string) *bool
func (p *QueryParser) ParseString(key string) *string
func (p *QueryParser) ParseUintArray(key string) []uint
// エラーハンドリング
func (p *QueryParser) HandleErrors(c *gin.Context) bool {
if p.HasErrors() {
HandleBadRequest(c, p.GetError())
return true
}
return false
}使用例:
go
parser := helper.NewQueryParser(c)
userID := parser.ParseUint("user_id")
date := parser.ParseDate("date", "2006-01-02")
page := parser.ParseInt("page")
limit := parser.ParseInt("limit")
// 一括エラーチェック
if parser.HandleErrors(c) {
return
}メリット:
- エラーハンドリングの集約 - 複数のパラメータのエラーを一括処理
- コードの簡潔性 - 個別のエラーチェックが不要
- 保守性の向上 - 新しい型の追加が容易
- 型安全性 - 各型に対応したメソッドで明示的に変換
注意点:
- HandleErrorsメソッドは明示的に呼び出す必要がある(Goの設計思想に沿った明示的なエラーハンドリング)
- エラーは蓄積されるため、全てのパース処理後にチェックすることで効率的