Google App Engine for Go
Python, Javaにつづく第3の言語としてGoogle App Engineに投入されたのはなんと Go Lang だった。Google内部にしかまじめに使っている人はいなさそうなのに。。。これを Go に対するGoogleのコミットメントの現れだと考えるか、単なる趣味の世界だと考えるか、微妙なところ。
Go とは
Go はGoogleが開発中の言語。
- 型付きだけど、ある程度型推論してくれるので、Javaのようにすべてに型をつけて回る必要がない、という最近ありがちなスタイル。
- 構造体はあるけど、クラスはない。けどそれっぽいことは書ける。継承もない。型パラメータもない。
- go routine と呼ばれる軽量スレッドが使える。
- GCあり。
ミニマルで気持ちいいけど、まだまだ処理系には難がある、と言う印象。
GAE for Go のパッケージ
インストールはすごく簡単。手元に必要なのはPythonの処理系だけ。パッケージにGoのコンパイラも含まれているので、事前にインストールしておく必要はない。パッケージは、Python のものをベースにしている。appcfg.py, dev_appserver.py など、コマンド名もそのままだ。
面白いのはコンパイルする必要が無いところ。Goはコンパイル言語なのだけど、少なくとも開発環境で使っている限りは、初めてのリクエストをうけたときに動的にコンパイルする。だからその時点でシンタックスエラーが出たりするのだけど、開発環境が自動的にソースの更新を検出して再コンパイルしてくれるので、開発環境を立ち上げっぱなしでインクリメンタルに開発することが可能。この辺、まるでインタプリタ言語を使っているかのような感じ。
制約
Goは軽量スレッドgo routineがウリなのだが、GAEでもgo routineは使える。ただし、実際に動作するスレッドは1つ。つまり概念的には複数スレッドになっているんだけど、それらが逐次化されて一つのスレッドとして動作する。ちょっと前に試した感じでは、Go の並列実行はまだまだで、あんまり早くならないから、これは別に問題にならないだろう。
もう一つ面白いのはGo はGAEのHigh Replication Storageでしか使えないこと。今後はこちらがデフォルトになるらしいので、あまり問題にならないだろう。
サービスの書き方
サービスの書き方もPython版に準ずる。
app.yaml
application: xxxxxxx version: xxxxx runtime: go api_version: 2 handlers: - url: /.* script: _go_app
runtimeを pythonではなくgoにする。また、api_versionがいきなり「2」なのにも注意。python版はまだ1なのに。。
script に指定されている_go_app はおまじないなのでこのまま書く。というかhandlers部全体がおまじない化している感じ。
サービス
サービスの書き方は、Go 標準のhttpパッケージでのサーバの記述方法に準ずる。hello worldはこんな感じになる。
package helloworld import ( "fmt" "http" ) func init() { http.HandleFunc("/", handle) } func handle(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "<html><body>Hello, World!</body></html>") }
init() は自動的に呼び出される初期化ルーチン。ここでハンドラとURLのマッピングを行っている。実際に処理するのは、ここではhandleと言う関数。まあ、非常にストレートフォワードだ。