1 of 21

Go言語でWEBアプリつくろう

Daigo Ikeda

Apr 19, 2014

2 of 21

自己紹介

Daigo Ikeda

@hogedigo

生息地:静岡〜渋谷

専門:Java。最近はGAE/Javaがメイン

合同会社ナイツオという会社をやってます

http://www.knightso.co.jp/

3 of 21

アジェンダ

  • 簡単なWEBアプリを作ってみる
  • ゴルーチンで平行処理を体験
  • RESTfulなWEBアプリをフレームワークで作る

4 of 21

1.簡単なWEBアプリを作ってみる

Goの標準ライブラリにはWEBアプリを作るために必要な機能が揃っている。

  • net/http�httpサーバーそのものも含まれている。apache等用意する必要がない!
  • html/template�テンプレートエンジン
  • encoding/json
  • encoding/xml

5 of 21

net/httpでHello world

net/httpを使って、ブラウザでHello worldを表示してみよう

  • ハンドラ関数を作成する。(引数はhttp.ResponseWriter, *http.Request)

  • ハンドラ関数を登録して、main関数でサーバーを起動する。�

  • 実行→http://localhost:9876/hello

6 of 21

課題1

URLのクエリパラメータを受け取って、結果に表示してみよう!

ヒント

  • http.Request.ParseForm()でパラメータ解析
  • http.Request.FormValue(string)でパラメータ取得
  • http://golang.org/pkg/net/http/#Request

7 of 21

Handlerインターフェース

ハンドラを関数ではなくインターフェースで渡すことが出来る。

  • http.HandlerインターフェースのServeHTTP(ResponseWriter, *Request)メソッドを実装

  • サーバーを起動方法は同じ

  • 実行→http://localhost:9876/handler

8 of 21

課題2

課題1のコードをHandlerインターフェースで作り替えてみよう!

9 of 21

HTMLテンプレート

html/templateパッケージを使用して、動的なHTMLを出力する

  • テンプレートソース作成

  • テンプレートオブジェクトを作成してパース

※上記例ではソースはstringだが、ParseFiles関数でファイルからパースすることも出来る

10 of 21

HTMLテンプレート(2)

  • パラメータを渡して実行

  • 実行→http://localhost:9876/template

11 of 21

HTMLテンプレート(3)

  • html/templateパッケージはtext/templateパッケージを継承しており、�いろいろな機能を持っている。
  • 波括弧2つで囲むことで動的に変化する箇所を記述する

機能例

  • パラメータ表示、プロパティアクセス�{{.}}、{{.Name}}、{{.Person.Name}}�※最初のドットはパラメータ構造中の現在の位置を表す。�基本的にはrootを参照するが、ループ中など変化するケースもある
  • 分岐�{{if eq . “hogedigo” }} … {{else}} ... {{end}}�※eqは組み込み関数
  • ループ�{{range .Fruits}} ... {{else}} … {{end}}�rangeはarray、slice、map、channelに対して使用可能�else以下はループが0件だった場合に表示される
  • 変数�{{$hoge := “xxx”}} {{$hoge}}

その他にもたくさん!! → http://golang.org/pkg/text/template/

  • 実行→http://localhost:9876/template

12 of 21

課題3

課題2のコードを、テンプレートを使って出力してみよう

  • httpリクエストパラメータで受け取ったnameを表示してみよう
  • テンプレートにmapを渡して要素を表示してみよう
  • テンプレートにarrayを渡して全件表示させてみよう
  • その他いろいろ実験してみよう(^^;

13 of 21

HTMLテンプレート(4)

html/templateの凄いところはエスケープ処理

下記コンテキストを判断して自動で必要なエスケープ処理を行ってくれる。

  • HTML
  • CSS
  • Javascript
  • URI

14 of 21

課題4

課題3のコードを修正して、エスケープされるか確認してみよう

パラメータ: <b>'Hello' & Gopher!</b>

埋め込む場所

  • HTML
  • CSS
  • scriptタグ内のJavascript
  • リンクタグ内のURL(aタグhref属性)

ブラウザで出力してソースを確認してみよう

15 of 21

2.goroutineで平行処理を体験

goroutineとは

  • Go言語標準の平行処理機能
  • 要はスレッド�でも他言語に比べてとても生成コストが小さい
  • 関数呼び出しの前にgoつけるだけ。簡単!
  • 値の受け渡しはchannelで

16 of 21

作るもの

簡易WEBクローラを作ってみよう。

  • htmlファイルのリンクを再帰的に辿ってフェッチ
  • 結果をjsonhtmlで出力

test1_1.html

test1.html

test1_1_2.html

test1_1_1.html

test1_1_3.html

test1_2_2.html

test1_2_1.html

test1_2_3.html

test1_3_2.html

test1_3_1.html

test1_3_3.html

test1_2.html

test1_3.html

17 of 21

出来上がり用意しました

https://github.com/hogedigo/shizgo/blob/master/webapp/handler/crawl.go

取得方法↓

go get github.com/hogedigo/shizgo/webapp

実行↓

http://localhost:9876/crawl?url=http://www.yahoo.com/&depth=3&mxpp=3

でもこれはまだgoroutine使ってません。

hogedigo/shizgo/blob/master/webapp/handler/crawl.gogithub.com/hogedigo/shizgo/blob/masapp/handler/crawl.go

18 of 21

goroutine使わないと・・・

  • 各fetchがシーケンシャルに実行される。

注:上記レポートはイメージです

19 of 21

非同期実行に変更

  • 処理をgoroutineで呼び出し
  • 結果の受け渡しはchannel経由で
  • channelからのgetを後でまとめて行うことで可能な限り同期を遅らせる(Futureパターン)

20 of 21

効果・・・

  • こんなカンジになったらいいな

21 of 21

最後に・・・

ごめんなさい。Restful間に合いませんでした。

Let it go〜