Yuichi Murata's Engineering Blog

Go / App Engine / GCP とか書いていきます

Go で Web アプリを作る

思いつきでブログを初めて見る。 最近 Go 言語を使って Web アプリを作成していたので、それ周りで少し記事を書いてみようと思う。

Go

最近になって様々なプロダクトで使われるようになってきた Go。Web アプリを作るに当たっては以下のような利点があると思っている。

  • 生産性が高い
  • パフォーマンスが良い
  • 覚えるのが楽

Go はコンパイル型の言語であるが非常に生産性が高いと思う。よく「Go はコンパイル型の言語だから手軽にプログラミングするのに向かない」という人がいるけど、実際に手を付けてみると、予想以上に生産性が良いことを実感できる。言語自体最近できたものであるから、言語仕様はシンプルで洗練されている。標準ライブラリも充実していて、シンプルなアプリケーションを作るのならばわざわざサードパーティのライブラリを使わずとも済む。

Go は特に並行処理を意識して言語仕様が設計されているので、特に Web アプリのような同時に複数のリクエストをさばくアプリケーションの開発にとても向いている。標準ライブラリをはじめ、さまざまな仕組みが Goroutine と呼ばれる並列処理の機構の上に動作する。そのため、特段プログラミングする側が意識しなくても、勝手に並行処理をしてくれる仕組みだ。従来の多くの言語では並列処理をしようとすると、アプリケーション側が意識してプログラミングをしたり、特別なライブラリなどを導入することが多くあった。しかしながら、Go を使うと基本的に素直にプログラムを書いていれば、うまいこと並行処理を行ってくれる(もちろん諸々の罠があったりするので、完全に意識しないで済むわけではないのだが…)。

先にも触れたが、Go の言語仕様はシンプルで洗練されている。それ故、覚えるのがとても簡単である。単純が故にときたまもどかしくなることもあるほどである。しかしながら、そのシンプルさ故に最低限の勉強をしておけばコードを読めるし、誰が書いても比較的似たコードになりやすい。これはチーム開発などにおいても便利な特性だと思う。

Hello World

Go のプログラムを書く場合には GOPATH を構成し、その GOPATH の上にプログラムを配置する必要がある。今回はホームディレクトリ以下に GOPATH を配置してみた。

$ GOPATH=~/go
$ mkdir -p ${GOPATH}/src/github.com/yuichi1004/go-webapp

さて定番の Hello World プログラムを書いてみる。go には強力な net/http パッケージが標準で備わっているので、高度な Http サーバーであっても、このパッケージを使って書くことが出来る。今回はこのパッケージのサンプルプログラムを拝借して、簡単なプログラムを書いてみよう。

http - The Go Programming Language

最もシンプルなプログラムは以下のようになる。

package main

import (
        "io"
        "net/http"
        "log"
)

func HelloHandler(w http.ResponseWriter, req *http.Request) {
        io.WriteString(w, "hello, world!\n")
}

func main() {
        http.HandleFunc("/hello", HelloHandler)
        log.Fatal(http.ListenAndServe(":8000", nil))
}

これで完了。あとはコードを実行してみる。

$ go run main.go
$ curl localhost:8000/hello
hello, world!

想定通りのレスポンスが返ってきた。