Your SlideShare is downloading. ×
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Go言語によるwebアプリの作り方

18,490

Published on

13/02/09に #gdgkobe で #golang の発表させて頂きました資料です。

13/02/09に #gdgkobe で #golang の発表させて頂きました資料です。

Published in: Technology
0 Comments
91 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
18,490
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
115
Comments
0
Likes
91
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Go言語によるWebアプリの作り方 2013/2/9 GDG Kobe Creative Commons Attribution 3.0 License
  • 2. 自己紹介• 河本 泰孝 @kwmt27• 車関連の仕事やってます。• androg.seesaa.net ブログ書いてます。• 私とGo言語との関わり • 2011年のDevQuizで初めて触った • 2012年1月のGo言語勉強会に参加 • 2012年4月の東海GTUGさんのGAE勉強会でGoを使った • 2012年8月のGDG神戸でGo言語のスライスについて発表 • 2012年10月,2013年1月GDG名古屋のスタートGo#0,#1に 参加 Creative Commons Attribution 3.0 License
  • 3. 自己紹介• 最近では公式サイトの • Writing Web Applications • Go Slices を翻訳してみたり。 https://github.com/kwmt/ golangwiki ↑↑ forkして一緒に翻訳しませんか? Creative Commons Attribution 3.0 License
  • 4. 自己紹介前回は、Go Slicesについて発表させてもらったので、今回は、公式サイトのWriting Web Applicationsを元に発表させて頂きます。 Creative Commons Attribution 3.0 License
  • 5. もくじCreative Commons Attribution 3.0 License
  • 6. もくじ1.Go言語の特徴&紹介2.Go言語の基本3.Webアプリ(wiki)を作成する4.tips Creative Commons Attribution 3.0 License
  • 7. Go言語の特徴&紹介 Creative Commons Attribution 3.0 License
  • 8. Go言語の特徴&紹介オープンソース(BSDライセンス)シンプルな構文(文末のセミコロン不要など)コンパイル言語並列処理を言語レベルでサポート(ゴルーチン)GCによるメモリ管理安全性が高い(ポインタ演算なし) Creative Commons Attribution 3.0 License
  • 9. Go言語の特徴&紹介Webアプリケーションを作るための豊富な標準ライブラリGoogle App Engine for Go*今回の話には出て来ません*チュートリアルがまずは参考になると思います。https://developers.google.com/appengine/docs/go/gettingstarted/現時点のバージョン 1.0.3 License Creative Commons Attribution 3.0
  • 10. Go言語の特徴&紹介公式サイト http://golang.org翻訳サイト http://golang.jp/Go Playground http://play.golang.org/A Tour of Go http://go-tour-jp.appspot.comgolang-nutshttp://groups.google.com/group/golang-nutsgolang-jphttps://groups.google.com/forum/#!forum/golang-jp Creative Commons Attribution 3.0 License
  • 11. Go言語の特徴&紹介公式サイト http://golang.org Go version 1翻訳サイト http://golang.jp/ 未対応箇所あるので注意Go Playground http://play.golang.org/A Tour of Go http://go-tour-jp.appspot.comgolang-nutshttp://groups.google.com/group/golang-nutsgolang-jphttps://groups.google.com/forum/#!forum/golang-jp Creative Commons Attribution 3.0 License
  • 12. Go言語の特徴&紹介go-wiki Articles http://code.google.com/p/go-wiki/wiki/Articlesgo-wiki Bookshttp://code.google.com/p/go-wiki/wiki/BooksGo1に対応した日本語の書籍 プログラミング言語Goフレーズブック 基礎からわかるGo言語 Creative Commons Attribution 3.0 License
  • 13. Go言語の特徴&紹介なにより、ゴーファー君がかわいい (今日の一番大切なこと) Creative Commons Attribution 3.0 License
  • 14. Go言語の基本Creative Commons Attribution 3.0 License
  • 15. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 16. package から始まります 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 17. 基本1 グループ化できます import( パッケージを読み込みます “fmt”package main “io/iouti.” )import "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 18. 基本1 main関数が最初に呼び 出されますpackage main main関数があるpackageはmainでなければimport "fmt" なりませんfunc main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 19. 基本1package mainimport "fmt" 文末にfunc main() { セミコロン不要 var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 20. 基本1package mainimport "fmt"func main() { := だけで定義できる var hello string = "Hello, 世界!" (型推論) //hello := “Hello, 世界!” String(hello)}func String(s string) { fmt.Println(s)} Creative Commons Attribution 3.0 License
  • 21. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello) 関数定義} プロトタイプ宣言不要func String(s string) { fmt.Println(s) 値渡し} Creative Commons Attribution 3.0 License
  • 22. 基本1package mainimport "fmt"func main() { var hello string = "Hello, 世界!" //hello := “Hello, 世界!” String(hello)} パッケージ名.(ドット)関数名でfunc String(s string) { fmt.Println(s) パッケージの関数を呼び出す} Creative Commons Attribution 3.0 License
  • 23. 基本2func main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) } }} Creative Commons Attribution 3.0 License
  • 24. 基本2 for文、if文は()不要 ループはfor文だけfunc main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) } }} Creative Commons Attribution 3.0 License
  • 25. 基本2 for文、if文は()不要 ループはfor文だけfunc main() { for i:=0;i<10;i++{ if i%2!=0 { fmt.Printf("%dは奇数n",i) 文法ではないですが } $go fmt for.go } で綺麗になります} func main() { ! for i := 0; i < 10; i++ { ! ! if i%2 != 0 { ! ! ! fmt.Printf("%dは奇数n", i) ! ! } ! } Creative Commons Attribution 3.0 License
  • 26. 基本3b := []string{“g”,”o”,”l”,”a”,”n”,”g”}配列に似ていますが、これをスライスといいます。b[2:] == []string{”l”,”a”,”n”,”g”}上記の左辺ように書くと、右辺と同じ意味になります。(スライスについては、前回の資料を参照ください。) Creative Commons Attribution 3.0 License
  • 27. 基本4構造体type MyData struct { name string //名前 Height int //身長}メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  • 28. 言い忘れてましたが、構造体に限らず、 基本4 変数名の最初の文字が 大文字と小文字に意味があります。構造体type MyData struct { name string //名前 Height int //身長}メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  • 29. 言い忘れてましたが、構造体に限らず、 基本4 変数名の最初の文字が 大文字と小文字に意味があります。構造体type MyData struct { javaで言うところ、 name string //名前 大文字がpublicで、 Height int //身長} 小文字がprivateです。メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  • 30. 基本4構造体type MyData struct { name string //名前 Height int //身長} 関数の一種だが、特定の型 と関連づけることが可能 (thisとかselfとかはない)メソッドfunc (data *Mydata) SetName(name string) { data.name = name} Creative Commons Attribution 3.0 License
  • 31. 基本5goを実行させるには?$go build hoge.go$./hoge$go run hoge.go(これはa.outが動く)$pwdfuga$go build$./fuga Creative Commons Attribution 3.0 License
  • 32. Webアプリ(wiki)を作成する Creative Commons Attribution 3.0 License
  • 33. ようやく本題Webアプリとして、wikiを作成して行きたいと思います。 Creative Commons Attribution 3.0 License
  • 34. wikiの仕様http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  • 35. wikiの仕様http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  • 36. wikiの仕様http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  • 37. wikiの仕様http://localhost:8080/edit/sample Editing sample sample body Save DB代わり /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 38. wikiの仕様http://localhost:8080/edit/sample /view/sample Editing sample sample sample body [edit] sample body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 39. wikiの仕様http://localhost:8080/edit/sample /view/sample Editing sample sample sample body [edit] sample body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 40. wikiの仕様http://localhost:8080/edit/sample /view/sample Title Title Editing sample sample sample body [edit] sample body Body Body Save DB代わり リダイレクト /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 41. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 42. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 43. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 44. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 Creative Commons Attribution 3.0 License
  • 45. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 Creative Commons Attribution 3.0 License
  • 46. HTTPサーバを開始net/httpパッケージを使います。package mainimport "net/http"func main() { ポート指定↓ ↓nilを指定(通常) http.ListenAndServe(":8080",nil)} ↑↑でHTTPサーバーを開始します。 何も出力していないから。 Creative Commons Attribution 3.0 License
  • 47. ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { http.HandleFunc(“/”, viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 48. ハンドラの登録 webページに出力させるには、 ハンドラを登録する必要があります。package mainimport "net/http"func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { ↓”/”にviewHandlerを登録 http.HandleFunc(“/”, viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 49. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} Creative Commons Attribution 3.0 License
  • 50. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)}type Request struct{ Method string URL *url.URL ... ↑net/urlパッケージ Form url.Values ...} Creative Commons Attribution 3.0 License
  • 51. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} type URL struct { Scheme stringtype Request struct{ Opaque string Method string User *Userinfo URL *url.URL Host string ... ↑net/urlパッケージ Path string Form url.Values RawQuery string ... Fragment string} } Creative Commons Attribution 3.0 License
  • 52. http.Requestfunc viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path)} type URL struct { Scheme stringtype Request struct{ Opaque string Method string User *Userinfo URL *url.URL Host string ... ↑net/urlパッケージ Path string Form url.Values RawQuery string ... Fragment string} } URLは次のような形を表現しています。 scheme://[userinfo@]host/path[?query][#fragment] Creative Commons Attribution 3.0 License
  • 53. ハンドラの登録先ほどのviewHandlerを登録すると、次のようになります。再掲func viewHandler(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, “Hello, %q”, r.URL.Path[1:])}func main() { http.HandleFunc(“/” viewHandler) http.ListenAndServe(":8080",nil)} Creative Commons Attribution 3.0 License
  • 54. データ構造の定義さて、このwikiはeditページとviewページにTitleとBodyを持っていますので、構造体として保持しておくことにしましょう。 type Page struct { Title string Body []byte } Creative Commons Attribution 3.0 License
  • 55. テキストファイルへ保存このPage構造体に対して、保存できるようにsaveメソッド作成しましょう。func (p *Page) save() error { パーミッション filename := p.Title + “.txt” を8進数で指定↓ return ioutil.WriteFile(filename, p.Body, 0600)} ↑string ↑[]byte※io/ioutilパッケージのインポートが必要です。 Creative Commons Attribution 3.0 License
  • 56. テキストファイルから読み込み次に保存したファイルを読み込めるような関数を作りましょう。func loadPage(title string) (*Page, error) { filename := title + “.txt” body, err := ioutil.ReadFile(filename) if err != nil { ↑ []byte、errorを返す return nil, err } return &Page{Title:title, Body:body}, nil}※io/ioutilパッケージのインポートが必要です。 Creative Commons Attribution 3.0 License
  • 57. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。 Creative Commons Attribution 3.0 License
  • 58. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。func viewHandler(w http.ResponseWriter, r *http.Request) {! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  • 59. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。func viewHandler(w http.ResponseWriter, r *http.Request) {! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  • 60. HTMLを生成http://localhost:8080/view/sample sample Titleにアクセスがあった時に、 [edit]sample.txtを読み込み、 sample body Body右図のように表示したい。 このようなHTMLの ハードコーディングはダサいですよね。func viewHandler(w http.ResponseWriter, r *http.Request) { いい方法がありますよ。奥さん! title := r.URL.Path[6:]! p, _ := loadPage(title)! fmt.Fprintf(w, "<h1>%s</h1><p>[<a href="/edit/%s">edit</a>]</p><div>%s</div>", p.Title, p.Title, p.Body)} Creative Commons Attribution 3.0 License
  • 61. HTMLを生成“text/template”パッケージを使います。 Creative Commons Attribution 3.0 License
  • 62. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> Creative Commons Attribution 3.0 License
  • 63. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> struct : Page{Title:”sample”} Creative Commons Attribution 3.0 License
  • 64. HTMLを生成“text/template”パッケージを使います。template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} Creative Commons Attribution 3.0 License
  • 65. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”}func viewHandler(w *http.ResponseWriter, r *http.Request){ ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  • 66. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”}func viewHandler(w *http.ResponseWriter, r *http.Request){ ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  • 67. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} Template構造体を作成しパースしますfunc viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:]! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  • 68. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} パースされたテンプレート tを Template構造体を作成しパースします pに適用して、func viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:] wに出力します! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  • 69. HTMLを生成 “text/template”パッケージを使います。 template : <p>Hello, {{.Title}}</p> Hello, sample struct : Page{Title:”sample”} パースされたテンプレート tを Template構造体を作成しパースします pに適用して、func viewHandler(w *http.ResponseWriter, r *http.Request){ *Templateとerror を返します ! title := r.URL.Path[6:] wに出力します! p, _ := loadPage(title) t, _ := tempalte.ParseFiles(“view.html”) t.Execute(w, p)} 先ほどハードコーディングされた HTMLを別ファイルに書く(あとで) Creative Commons Attribution 3.0 License
  • 70. HTMLを生成公式ページを見ると”html/template”というのもありますが、“text/template” と同じインターフェースを持ちます。違いは、”html/template”は攻撃に強いセキュアなHTMLを生成します。ただし、HTMLに書いたコメントが消されます(´;ω;`) Creative Commons Attribution 3.0 License
  • 71. HTMLを生成view.htmlを次のようにします。 Creative Commons Attribution 3.0 License
  • 72. HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> Creative Commons Attribution 3.0 License
  • 73. HTMLを生成view.htmlを次のようにします。<h1>{{.Title}}</h1><p>[<a href="/edit/{{.Title}}">edit</a>]</p><div>{{printf "%s" .Body}}</div> これは、 .Bodyが[]byteであるため、stringにして表示しています。 http://golang.org/pkg/text/template/#hdr-Functions Creative Commons Attribution 3.0 License
  • 74. HTMLを生成 /edit/sample Editing sample次にeditページを作成します。edit.htmlを次のようにしましょう。 Save Creative Commons Attribution 3.0 License
  • 75. HTMLを生成 /edit/sample Editing sample次にeditページを作成します。edit.htmlを次のようにしましょう。<h1>Editing {{.Title}}</h1> Save<form action="/save/{{.Title}}" method="POST"><div><textarea name="body" rows="20" cols="80">{{printf "%s" .Body}}</textarea></div><div><input type="submit" value="Save"></div></form> Creative Commons Attribution 3.0 License
  • 76. HTMLを生成次に、editページも同様に作成しましょう。 Creative Commons Attribution 3.0 License
  • 77. HTMLを生成editHandlerを次のようにします。http.HandleFunc(“/edit/”, editHandler) ←ハンドラ登録も忘れずにfunc editHandler(w *http.ResponseWriter,r *http.Request){ title := r.URL.Path[6:] p, err := loadPage(title) if err != nil { p = &Page{Title: title} //空のPage構造体を作成 } t, _ := template.ParseFiles(“edit.html”) t.Execute(w, p)} Creative Commons Attribution 3.0 License
  • 78. どこまでできた?http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  • 79. どこまでできた?http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  • 80. どこまでできた?http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  • 81. どこまでできた?http://localhost:8080/edit/sample editHandler Editing sample sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 82. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 83. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 84. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 85. どこまでできた?http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 86. saveHandlerを作成edit.htmlを次のようにします。http.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} Creative Commons Attribution 3.0 License
  • 87. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} Creative Commons Attribution 3.0 License
  • 88. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できるhttp.HandleFunc(“/save/”, saveHandler)func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} ステータスコードを付与してリダイレクトする ここでは“/view/” + title にリダイレクト Creative Commons Attribution 3.0 License
  • 89. saveHandlerを作成テキストエリアにedit.htmlを次のようにします。入力した内容(string型)を取得できる http.StatusMovedPermanently = 301http.HandleFunc(“/save/”, saveHandler) http.StatusFound = 302 http.StatusSeeOther = 303func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[6:] http.StatusTemporaryRedirect = 307 body := r.FormValue("body") p := &Page{Title:title, Body:[]byte(body)} p.save() http.Redirect(w, r, "/view/" + title, http.StatusFound)} ステータスコードを付与してリダイレクトする ここでは“/view/” + title にリダイレクト Creative Commons Attribution 3.0 License
  • 90. 基本的なwikiは完成http://localhost:8080/edit/sample Creative Commons Attribution 3.0 License
  • 91. 基本的なwikiは完成http://localhost:8080/edit/sample Editing sample Save Creative Commons Attribution 3.0 License
  • 92. 基本的なwikiは完成http://localhost:8080/edit/sample Editing sample sample body Save Creative Commons Attribution 3.0 License
  • 93. 基本的なwikiは完成http://localhost:8080/edit/sample editHandler Editing sample sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 94. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 95. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Editing sample sample sample body [edit] sample body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 96. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 97. 基本的なwikiは完成http://localhost:8080/edit/sample /view/sample editHandler Title Title Editing sample edit.html sample viewHandler view.html sample body [edit] sample body Body saveHandler Body Save /save/sample sample.txtを作成し、内容を保存 Creative Commons Attribution 3.0 License
  • 98. 基本的なwikiは完成エラー処理など、殆どやってないので、イケてないところが多く残っていますが、wikiの基本機能は完成です。Writing Web Applicationでは、regexpパッケージ使用して入力チェックしたり、クロージャを使用したりありますが、詳しくはWebを参照ください。 Creative Commons Attribution 3.0 License
  • 99. tipsCreative Commons Attribution 3.0 License
  • 100. GET、POSTnet/http パッケージfunc Get(url string) (resp *Response, err error)例 res, _ := http.Get("http://www.google.com/robots.txt") body, _ := iouti.ReadAll(res.Body) res.Body.Close()func Post(url string, bodyType string, body io.Reader)(resp *Response, err error) Creative Commons Attribution 3.0 License
  • 101. XML、JSON encoding/xml パッケージが使用できます。 encoding/json例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  • 102. XML、JSON encoding/xml パッケージが使用できます。 encoding/json xml 構造体 json例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  • 103. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 json Unmarshal(data []byte, v interface{}) error例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  • 104. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 同じI/F json Unmarshal(data []byte, v interface{}) error例 http://play.golang.org/p/ADbOOeCVCn Creative Commons Attribution 3.0 License
  • 105. XML、JSON encoding/xml パッケージが使用できます。 encoding/json Marshal(v interface{}) (data []byte, error) xml 構造体 同じI/F json Unmarshal(data []byte, v interface{}) error ポインタじゃないと例 http://play.golang.org/p/ADbOOeCVCn 怒られます Creative Commons Attribution 3.0 License
  • 106. サーバ上で Javascriptを使うhttp.Handle(“/js/”, http.StripPrefix(“/js/”, http.FileServer(http.Dir(“js”)))) Creative Commons Attribution 3.0 License
  • 107. templateファイルを分けることも可能<!doctype html><html><head></head><body>{{template “content” .}}</body></html>{{define “content”}}{{.Titile}}{{end}} Creative Commons Attribution 3.0 License
  • 108. データベースのドライバSQL database drivers Creative Commons Attribution 3.0 License
  • 109. FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.HandleFunc("/", index)! l, _ := net.Listen("tcp", ":9000")! fcgi.Serve(l, mux)}func index(w http.ResponseWriter, r *http.Request) {! fmt.Fprintf(w, "hello,FastCGI!")} Creative Commons Attribution 3.0 License
  • 110. FastCGIpackage mainimport (! "fmt"! "net"! "net/http"! "net/http/fcgi")func main() {! mux := http.NewServeMux()! mux.HandleFunc("/", index)! l, _ := net.Listen("tcp", ":9000")! fcgi.Serve(l, mux)}func index(w http.ResponseWriter, r *http.Request) {! fmt.Fprintf(w, "hello,FastCGI!")} nginx上で動きます Creative Commons Attribution 3.0 License
  • 111. websocketwebsocketのパッケージはGo 1になって標準パッケージではなくなりましたが、別のリポジトリに残ってます。“code.google.com/p/go.net/websocket”下記のブログにwebsocketを使ってチャット作った動画が上がっています。http://u.hinoichi.net/2012/12/14/websocketを使ってみた-with-go言語/動画http://www.youtube.com/watch?feature=player_embedded&v=ekXCCIxN3gg Creative Commons Attribution 3.0 License
  • 112. 以上、つたない説明でしたがGo言語でWebアプリを作る足がかりなれば幸いです。 Creative Commons Attribution 3.0 License
  • 113. ご清聴ありがとうございました Creative Commons Attribution 3.0 License

×