Golangで簡単なwebアプリを作るためにどうしたらいいか調べていたので、試しにGojiというフレームワークと、go-xslateを使ってHello Worldをしてみた。
GitHub - shibayu36/goji-and-go-xslate-sample
http://localhost:8000/hello/world にアクセスすると、以下の様なものが出るだけのアプリケーション。
これを作った手順にしたがって簡単に紹介。
作成手順
まずはルーティングを作成
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() }
完成
最終的に完成したのがGitHub - shibayu36/goji-and-go-xslate-sample。ひとまず最低限Webアプリケーションの雛形は作れたと思う。
困った所
- Gojiでquery parameterを取る方法がいまいち分からなかった。自分で頑張るしか無い?
- 今後さらに大きめなものを作ろうとすると、便利メソッドをどこかに作るということになるけど、どの辺に作るのがベスト・プラクティスなのかよく分からなかった
気付き
- Goのgodoc見るよりコード見たほうが早い
- 新しい言語を学ぶときはgithubで検索したほうが早い