--- title: Go言語でhttpサーバーを立ち上げてHello Worldをする tags: Go:1.3 author: taizo slide: false --- Go言語でシンプルにhttpサーバーを立ち上げる場合[net/http](http://golang.org/pkg/net/http/)を使う。 ```go:server1.go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World") } func main() { http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる http.ListenAndServe(":8080", nil) } ``` # ServeHTTPを使う 既存のstructや型に対して、`ServeHTTP`メソッドを用意することで `http.Handle`に登録出来るようにする ```go package main import ( "fmt" "net/http" ) type String string func (s String) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, s) } func main() { http.Handle("/", String("Hello World.")) http.ListenAndServe("localhost:8000", nil) } ``` # `text/template`を使う `ServeHTTP`を既存の型などに定義しなくても `http.ResponseWriter`と`*http.Request`を引数に取る関数を用意すれば ハンドラとして登録できる。 (こういうのは`Handler`インターフェースが正しく設定されていればいい、って説明になるのかな) Goのテンプレートには [text/template](http://golang.org/pkg/text/template/) と [html/template](http://golang.org/pkg/html/template/) がある。 [text/template](http://golang.org/pkg/text/template/)を使う場合は以下のようになる。 ```go:server2.go package main import ( "net/http" "text/template" ) type Page struct { // テンプレート展開用のデータ構造 Title string Count int } func viewHandler(w http.ResponseWriter, r *http.Request) { page := Page{"Hello World.", 1} // テンプレート用のデータ tmpl, err := template.New("new").Parse("{{.Title}} {{.Count}} count") // テンプレート文字列 if err != nil { panic(err) } err = tmpl.Execute(w, page) // テンプレートをジェネレート if err != nil { panic(err) } } func main() { http.HandleFunc("/", viewHandler) // hello http.ListenAndServe(":8080", nil) } ``` # ファイルのテンプレートを使う テンプレート元の文字列をファイルから読み込みたい場合は `func ParseFiles(filenames ...string) (*Template, error)`を使う。 ```go:server.go package main import ( "net/http" "text/template" ) type Page struct { Title string Count int } func viewHandler(w http.ResponseWriter, r *http.Request) { page := Page{"Hello World.", 1} tmpl, err := template.ParseFiles("layout.html") // ParseFilesを使う if err != nil { panic(err) } err = tmpl.Execute(w, page) if err != nil { panic(err) } } func main() { http.HandleFunc("/", viewHandler) // hello http.ListenAndServe(":8080", nil) } ``` テンプレートファイルを用意する ```html:layout.html {{.Title}} {{.Title}} {{.Count}} count ``` 実行 ```bash $ go run server.go $ open http://localhost:8080 # Macの場合 ``` ブラウザで “Hello World. 1 count” と表示される # 参考 * [Go言語によるwebアプリの作り方](http://www.slideshare.net/yasi_life/goweb-16448500)