こんにちは、hiroyukimです。
この記事はGo4 Advent Calendar 2018 16日目となります。
私はこれまでLL系を中心にWeb開発をよくしてきました。Web開発ではリクエストパラメータを取得しようとした場合。例えば、PHPを例に取るとこのようなリクエストオブジェクトからkeyを指定して取得するという形が一般的かと思います。
$name = $request->query('name');
今回、GoでWeb開発をしていてginというフレームワークを使用していたところ
lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
このようにkeyを指定して取得するという手法もあるのですが、
type StructB struct {
NestedStruct StructA
FieldB string `form:"field_b"`
}
func GetDataB(c *gin.Context) {
var b StructB
c.Bind(&b)
c.JSON(200, gin.H{
"a": b.NestedStruct,
"b": b.FieldB,
})
}
あらかじめ定義していた構造体にBindさせることが出来るんですね。Goの場合型がPHPなどと比べると扱いが厳密なので、keyで取得した物をいちいち変換する行為があるはずで、面倒だなと思っていたので、こんな便利な物があることに驚きました。(ちなみに、formはこの辺を見るとreflect使っていたりして参考になります。)
しかし、便利だなと思う反面このやり方はGoの場合一般的なのだろうかと気になりました。
そこで、現在においてGoのWebFramworkどんなのがあるのか調べてみました。
これが、cronで定期更新されているようなので参考にします。
framework | url |
---|---|
gin | https://github.com/gin-gonic/gin |
beego | https://github.com/astaxie/beego |
echo | https://github.com/labstack/echo |
revel | https://github.com/revel/revel |
独断と偏見でこの4つにを見ることにしてみました。
ginはもう調べてあるのでbeegoから
beego
名前はBindじゃないんですが事前に構造体を定義して取得するという意味では
ParseFrom
というメソッドがあるようです。
goにきてからthis
という用語を殆ど見なかったんですがbeegoではあるようですね。
func (this *MainController) Post() {
u := User{}
if err := this.ParseForm(&u); err != nil {
//handle error
}
}
- https://beego.me/docs/mvc/controller/params.md
- https://beego.me/docs/mvc/controller/params.md#parse-to-struct
echo
echoの方にはBindという名前で実装されていました
func(c echo.Context) (err error) {
u := new(User)
if err = c.Bind(u); err != nil {
return
}
return c.JSON(http.StatusOK, u)
}
reval
revalもParams.Bind
という形で存在していました。
func (c SomeController) DoResponse() revel.Result {
var ids []int
c.Params.Bind(&ids, "ids")
}
結論
goのweb framworkではパラメータをBindする方式は割と一般的なようです。この方式がどこから来たかは気になりますが、それはまた別の話なので機会がありましたら書こうかと思います。とりあえず、非常に便利なんで使ったら良いんじゃ無いかと思います。