Go 1.5 & 1.6の新機能のおさらい

01dc8e954957a10b428aa60b28c89d52?s=47 Ian Lewis
December 01, 2015

Go 1.5 & 1.6の新機能のおさらい

Goは実運用の事例が最近多く出ています。
なんで最近実用的に使っている開発者が増えているのでしょうか。
実は互換性を待ちながら、便利な機能が
たくさん出てくるのがその理由の一つです。
9月にリリースされたGo 1.5と開発中のGo 1.6の新しい機能を紹介します。

01dc8e954957a10b428aa60b28c89d52?s=128

Ian Lewis

December 01, 2015
Tweet

Transcript

  1. Ian Lewis Developer Advocate Google Cloud Platform Go 1.5 &

    1.6の新機能のおさらい
  2. Confidential & Proprietary Google Cloud Platform 2 Ian Lewis Developer

    Advocate, Google Cloud Platform Tokyo, Japan @IanMLewis google.com/+IanLewis-hoge
  3. Confidential & Proprietary Google Cloud Platform 3 Go! Image ©

    Takuya Ueda. Licensed under CC BY 3.0.
  4. Confidential & Proprietary Google Cloud Platform 4 Go(lang) • Google

    で起こる問題解決するために Googleで開発 ◦ 開発スピード ◦ 使いにくい型システム ◦ 並行処理
  5. Confidential & Proprietary Google Cloud Platform 5 Goの機能 • ネイティブコードにコンパイル

    • ガーメージコレックション • 型付き • Goroutines • Channels • Structs/Interfaces
  6. Confidential & Proprietary Google Cloud Platform 6 Goroutines & Channels

    Channel Goroutine Goroutine
  7. Confidential & Proprietary Google Cloud Platform 7 Goroutines & Channels

    Channel Goroutine Goroutine Channel
  8. Confidential & Proprietary Google Cloud Platform 8 Goroutines & Channels

    func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum // send sum to c }
  9. Confidential & Proprietary Google Cloud Platform 9 Goroutines & Channels

    func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) }
  10. Confidential & Proprietary Google Cloud Platform 10 事例 Image ©

    Takuya Ueda. Licensed under CC BY 3.0.
  11. Confidential & Proprietary Google Cloud Platform 11 Docker • コンテナランタイムエンジン

    • HTTP API サーバー • イメージパケージフォーマット Image © Docker All Rights Reserved http://docs.docker.com/
  12. Confidential & Proprietary Google Cloud Platform 12 etcd • Distributed

    Key-Value Store • Used for Storing Cluster State/Config • Implements RAFT Protocol
  13. Confidential & Proprietary Google Cloud Platform 13 Vitess • Used

    at Youtube • Sharding MySQL Servers • Serving all YouTube DB traffic since 2011 • http://vitess.io/
  14. Confidential & Proprietary Google Cloud Platform 14 Kubernetes • Container

    Cluster Manager • Manages a Distributed Cluster • Supports Pods • Provides HTTP API
  15. Confidential & Proprietary Google Cloud Platform 15 Gorilla • ウェブツールキット

    • リクエストコンテキスト • セッション管理 • URLルーティング • URLリバース • Web Sockets
  16. Confidential & Proprietary Google Cloud Platform 16 Go 1.5 Image

    © Takuya Ueda. Licensed under CC BY 3.0.
  17. Confidential & Proprietary Google Cloud Platform 17 Go 1.5 •

    Released Aug 2015 • Go 1.0から、一番大きいリリース • 新しい並行GC • Go コンパイラやツールチェインの改善 • パッケージベンダリング (beta) • goroutineスケジューラーの改善
  18. Confidential & Proprietary Google Cloud Platform 18 並行GC • ユーザープログラムと並行に動く

    • プログラムを停止する時間を短めに (<10ms)
  19. Confidential & Proprietary Google Cloud Platform 19 並行GC

  20. Confidential & Proprietary Google Cloud Platform 20 並行GC

  21. Confidential & Proprietary Google Cloud Platform 21 並行GC

  22. Confidential & Proprietary Google Cloud Platform 22 並行GC

  23. Confidential & Proprietary Google Cloud Platform 23 並行GC

  24. Confidential & Proprietary Google Cloud Platform 24 並行GC • ユーザープログラムと並行に動く

    • プログラムを停止する時間を短めに (<10ms)
  25. Confidential & Proprietary Google Cloud Platform 25 Go コンパイラやツールチェインの改善 •

    GoはGoで書かれている • GoをビルドするにはCコンパイラーはいらな い • Go開発はシンプルになる
  26. Confidential & Proprietary Google Cloud Platform 26 Go コンパイラやツールチェインの改善 •

    新しい go tool trace コマンド • Goシェアドライブラリー サポート
  27. Confidential & Proprietary Google Cloud Platform 27 Go コンパイラやツールチェインの改善 $

    go test -o pkg.test net/http -trace trace.out ok net/http 20.876s $ go tool trace pkg.test trace.out
  28. Confidential & Proprietary Google Cloud Platform 28 Goパッケージベンダリング • パッケージベンダリング

    ◦ GO15VENDOREXPERIMENT=1 ◦ vendor ディレクトリに依存ライブラリを入 れる
  29. Confidential & Proprietary Google Cloud Platform 29 Goパッケージベンダリング hoge/ hoge.go

    vendor/piyo/ piyo.go fuga/ fuga.go
  30. Confidential & Proprietary Google Cloud Platform 30 Goパッケージベンダリング hoge/ hoge.go

    vendor/piyo/ piyo.go fuga/ fuga.go piyo/ piyo.go
  31. Confidential & Proprietary Google Cloud Platform 31 Goパッケージベンダリング • 特定なバージョンを部分的に使う

    • 分かりやすくて簡単 • ベンダリングするツールがいくつか (Godeps など)
  32. Confidential & Proprietary Google Cloud Platform 32 Go 1.6 Image

    © Takuya Ueda. Licensed under CC BY 3.0.
  33. Confidential & Proprietary Google Cloud Platform 33 Go 1.6 •

    Release Jan 2016? • パッケージベンダリング (stable) • HTTP/2 サポート (net/http) • Text/HTMLテンプレートのコード ブロック • メモリサニタイザー
  34. Confidential & Proprietary Google Cloud Platform 34 HTTP/2 Old //

    hello world, the web server func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { m := http.NewServeMux() m.HandleFunc("/", HelloServer) srv := &http.Server{ Addr: ":8000", // Normally ":443" Handler: m, } http2.ConfigureServer(srv, &http2.Server{}) log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key")) }
  35. Confidential & Proprietary Google Cloud Platform 35 HTTP/2 // hello

    world, the web server func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/", HelloServer) log.Fatal(http.ListenAndServeTLS( ":8000", "server.crt", "server.key", nil)) }
  36. Confidential & Proprietary Google Cloud Platform 36 HTTP/2 // hello

    world, the web server func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/", HelloServer) log.Fatal(http.ListenAndServeTLS( ":8000", "server.crt", "server.key", nil)) }
  37. Confidential & Proprietary Google Cloud Platform 37 テンプレートの block キーワード

    • テンプレート継承が実現できる • block を定義して、別のテンプレートで オーバーライドできる
  38. Confidential & Proprietary Google Cloud Platform 38 テンプレートの block キーワード

    <html> <head> <title>{{ block "title" .}}Default title{{end}}</title> </head> <body>{{ block "body" .}}Default body{{end}}</body> </html>
  39. Confidential & Proprietary Google Cloud Platform 39 テンプレートの block キーワード

    {{define "title"}}About page{{end}} {{define "body"}}About me{{end}}
  40. Confidential & Proprietary Google Cloud Platform 40 テンプレートの block キーワード

    baseTmpl, err := template.New("base").Parse(base) if err != nil { log.Fatal(err) } aboutPageTmpl, err := template.Must(baseTmpl.Clone()).Parse(aboutPage) if err != nil { log.Fatal(err) } if err := aboutPageTmpl.Execute(os.Stdout, nil); err != nil { log.Fatal(err) }
  41. Goを使い尽く しましょう

  42. Confidential & Proprietary Google Cloud Platform 42 Go を使い尽くしましょう •

    Service Oriented Architecture • サービス基盤 • コンテナ
  43. Confidential & Proprietary Google Cloud Platform 43 Ian Lewis Developer

    Advocate, Google Cloud Platform Tokyo, Japan @IanMLewis google.com/+IanLewis-hoge Thank You!