Golang で Web アプリケーションを作る際のメモ

自分用メモ。

ここら辺を参考にした。
Golang でのウェブ開発を考えてみる - Qiita

cli

GitHub - urfave/cli: A simple, fast, and fun package for building command line apps in Go
ここら辺が鉄板。
ちょっとアレと思ったのが、グローバルオプションの位置がサブコマンドの前に書かないといけない。
$ ./app runserver --config=./setting.hcl とかやる場合は、runserver のオプションにしないと行けない。
あと、グローバルオプションが goji の goji.Serve() と被って困った。


試してないけど良さそうと思ったけど、どうなんだろう。
GitHub - mitchellh/cli: A Go library for implementing command-line interfaces.

Web Framework

goji で決定。
Flask みたいなので良い。


コンテキストを持ち回すのをどうすれば良いのか悩む。

func showPage(c web.C, w http.ResponseWriter, r *http.Request) {
}
func (ctx AppContext) showPage(c web.C, w http.ResponseWriter, r *http.Request) {
}

goji のコンテキストにアプリケーションコンテキストとして渡すのか、goji のコンテキストを使うか…。
とりあえずアプリケーションコンテキストは goji 以外でも持ち回すことになりそうなので、後者でやってみる。
アプリケーションコンテキストに、ロガー、設定ファイル、Redis のコネクション等を持ち回す予定。

テンプレートエンジン

GitHub - flosch/pongo2: Django-syntax like template-engine for Go
Jinja2 というか Django なテンプレートエンジン。
フィルタとか自分で作れそうなのが良い。
Jinja2 の `set var` みたいなのがテンプレートの中で出来たら良いんだけど、出来ないのでそれはあきらめる。

設定ファイル

GitHub - hashicorp/hcl: HCL is the HashiCorp configuration language.
これで良い。
最初使い方が良くわからなかったけど、サンプル探して読んだら出来た。

ログ

プロダクションで使う場合ログはきちんとしたい。
標準のはシンプルなので、保守運用の場合にもう少し高機能なのが欲しい。
GitHub - sirupsen/logrus: Structured, pluggable logging for Go.


開発時は Stdout とファイルに出力してほしい。
io.MultiWriter 使えとの事なので、以下のようにした。

logf, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
out := io.MultiWriter(os.Stdout, logf)
logger := logrus.Logger{
    Formatter: &logrus.TextFormatter{DisableColors: true},
    Level:     level,
    Out:       out,
}

logrus にはローテーション機能はなくて、logrotate(8) を使えとなっているが、OS ではなくてアプリケーションで制御したい場合もあるので、そういう場合は GitHub - natefinch/lumberjack: lumberjack is a log rolling package for Go を使えば良さそう。

使わなかったもの

ORM

どれが良いんだろう。

i18n

GitHub - nicksnyder/go-i18n: Translate your Go program into multiple languages.
Pongo2 と連動してたら良いんだけど、自分で連携するものを作る必要あり。

Graceful restart

GitHub - facebookgo/grace: Graceful restart & zero downtime deploy for Go servers.
もっともこれ使う場合は、goji の graceful shutdown と被らないように作らないといけない。

アセット管理?

GitHub - jteeuwen/go-bindata: Hard fork of jteeuwen/go-bindata because it disappeared, Please refer to issues#5 for details.


他にも色々試したら追記していく。


追記

まず Vim を用意する。
Release MacVim-KaoriYa 20150314 · splhack/macvim-kaoriya · GitHub


次に Golang 用のプラグインをインストールする。
GitHub - google/vim-ft-go
GitHub - vim-jp/vim-go-extra: Extra plugin for golang
vim-jp » vim-go-extra を公開致します。

vimrc に以下を追記する。

" Golang {{{
execute 'set rtp+=' . globpath($GOPATH, 'src/github.com/nsf/gocode/vim')
" }}}
:Fmt

とかでフォーマットしたり、C-x C-o とかで補完が出来るようになる。