Quantcast
Channel: Go4 Advent Calendarの記事 - Qiita
Viewing all articles
Browse latest Browse all 25

GinでBindingが物珍しかったので他のフレームワークも調べてみた

$
0
0

こんにちは、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
    }
}

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する方式は割と一般的なようです。この方式がどこから来たかは気になりますが、それはまた別の話なので機会がありましたら書こうかと思います。とりあえず、非常に便利なんで使ったら良いんじゃ無いかと思います。


Viewing all articles
Browse latest Browse all 25

Trending Articles