読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

gojiとgo-xslateを使って、GoでのWebアプリケーション開発入門をした

tech golang

Golangで簡単なwebアプリを作るためにどうしたらいいか調べていたので、試しにGojiというフレームワークと、go-xslateを使ってHello Worldをしてみた。

shibayu36/goji-and-go-xslate-sample · GitHub

http://localhost:8000/hello/world にアクセスすると、以下の様なものが出るだけのアプリケーション。
f:id:shiba_yu36:20141116100454p:plain

これを作った手順にしたがって簡単に紹介。

作成手順

まずはルーティングを作成

https://goji.io/によると、main関数の中にルーティングを作成してServeすれば良いだけっぽいのでまずはそれを作ってみる。

func main() {
	goji.Get("/hello/:name", hello)
	goji.Serve()
}

これで/hello/{name}でhello関数が使われるようになった。URL内の:nameの値は後述するgoji/webのCというstructから取得できる。

hello関数を作る

hello関数を作ってみる。ここでは単に出力するだけではなくて、go-xslateを利用して出力してみる。

go-xslateはインスタンスを作る時にいろいろ設定が可能。今回はテンプレート置き場をtemplates/以下に、かつTTerseを利用してxslateインスタンスを作成し、レンダリングするコードを書いてみる。

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
	tx, _ := xslate.New(xslate.Args {
		"Loader": xslate.Args {
			"LoadPaths": []string { "./templates" },
		},
		"Parser": xslate.Args{"Syntax": "TTerse"},
	})

	tx.RenderInto(w, "hello.tt", xslate.Vars {
		"name": c.URLParams["name"],
	});
}

c.URLParams["name"]とすればURL中の:nameに入った部分を取得できるので、それをxslateのrenderする時に渡している。

テンプレートを書く

あとはtemplates/hello.ttにテンプレートを書くだけ。今回は無駄にwrapper.ttも作成し、WRAPPERも利用してみる。

hello.tt

[%- WRAPPER "wrapper.tt" -%]
  Hello, [% name %]
[%- END -%]

wrapper.tt

<!DOCTYPE html>
<html>
  <head>
    <title>Goji and go-xslate sample</title>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
    <link rel="stylesheet" type="text/css" href="/css/style.css" />
    <script src="/js/main.js"></script>
  </head>
  <body>
    <header id="global-header">
      Goji and go-xslate sample
    </header>
    <div id="content">
      [% content %]
    </div>

    <footer id="global-footer">
      Golang
    </footer>
  </body>
</html>

静的ファイルも配信してみる

静的ファイルも配信し、cssやjsも利用したいと思ったので、配信するコードを書いてみる。これはhttp.FileServerを利用すると出来る。

func main() {
	goji.Get("/hello/:name", hello)

	staticPattern := regexp.MustCompile("^/(css|js)")
	goji.Handle(staticPattern, http.FileServer(http.Dir("./static")))
	goji.Serve()
}

正規表現を利用して、/cssと/js以下からはstatic/以下のコンテンツを配信するというコードを書いてみた。

完成

最終的に完成したのがshibayu36/goji-and-go-xslate-sample · GitHub。ひとまず最低限Webアプリケーションの雛形は作れたと思う。

困った所

  • Gojiでquery parameterを取る方法がいまいち分からなかった。自分で頑張るしか無い?
  • 今後さらに大きめなものを作ろうとすると、便利メソッドをどこかに作るということになるけど、どの辺に作るのがベスト・プラクティスなのかよく分からなかった

気付き

  • Goのgodoc見るよりコード見たほうが早い
  • 新しい言語を学ぶときはgithubで検索したほうが早い

まとめ

今回はGolangでWebアプリケーションをどう書くかを考えるため、ひとまずGojiとgo-xslateを利用してサンプルアプリケーションを作ってみた。

go-xslateは元々Perlやっていたので慣れてたので、テンプレートエンジンはこれ使ったらいいって思った。Gojiに関しては、薄いというのは非常に良いのだけれど、いまいちかゆいところに手が届いてない気がしたので、もうちょっとという感じ。gorilla toolkitなど他のフレームワークも利用してみたい。