Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Gopher Fest 2017参加レポート

7,413 views

Published on

golang.tokyo#6 で発表したレポートです。
https://golangtokyo.connpass.com/event/57168/

Published in: Technology
  • Be the first to comment

Gopher Fest 2017参加レポート

  1. 1. Gopher Fest 2017 参加レポート 2017/06/01(木) golang.tokyo #6 The Go gopher was designed by Renee French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.
  2. 2. 自己紹介 メルカリ/ソウゾウ 上田拓也 twitter: @tenntenn ■ コミュニティ活動 Google Cloud Platform User Group (GCPUG) Tokyo Goビギナーズ golang.tokyo Go Conference ■ 業務 GAE/Goでメルカリカウルを作ってます GoやGCPコミュニティを盛り上げる仕事 Gopherを描く仕事(LINEスタンプ) 2
  3. 3. 3 Gopher Fest 2017に参加しました http://tech.mercari.com/entry/gopherfest2017_report
  4. 4. Gopher Festとは? ● Google I/Oに合わせて開催されるイベント ● 5/15にサンフランシスコで開催 ○ イベントページ ● 主催はGoSF ● 発表者が豪華 4
  5. 5. セッション一覧 ● The State of Go / Francesc Campoy ○ 8月リリース予定のGo1.9に関するセッション ● Event Sourcing – Architectures and Patterns / Matt Ho ○ イベントソーシングをどうGoで扱うか ● Upspin / Rob Pike ○ upspinの話 ● Adding Context to NATS / Waldemar Quevedo ○ NATSにおいてどうContextを導入していったかという話 5
  6. 6. The State of Go 6 https://talks.golang.org/2017/state-of-go-may.slide
  7. 7. Goの開発状況 7 ● Go1.8は2月16日にリリース済 ● Go1.9は5月1日にコードフリーズ済 ○ あとはバグフィックスのみ ● Go1.9は8月上旬にリリース予定
  8. 8. Goの開発状況 8 ● Go1.8は2月16日にリリース済 ● Go1.9は5月1日にコードフリーズ済 ○ あとはバグフィックスのみ ● Go1.9は8月上旬にリリース予定
  9. 9. Android Go 9
  10. 10. 10
  11. 11. 関係なかった(´・ω・`) 11
  12. 12. 言語仕様の変更 12
  13. 13. リファクタリング ● 安全にリファクタリングには? ○ Codebase Refactoring (with help from Go) by rsc 13 新APIの追加 コードの変更 旧APIの削除 現状のGoで簡単にできるのか?
  14. 14. 定数の場合 14 package status const OK = http.StatusOK STEP-1: 新APIの追加 ■ statusパッケージを追加してみる if res.StatusCode != http.StatusOK { STEP-2: コードの変更 if res.StatusCode != status.OK { STEP-3: 旧APIの削除 問題なし!
  15. 15. 関数の場合 15 func DoGet(url string) (*http.Response, error) { return Get(url) } STEP-1: 新APIの追加 ■ http.Getをリネームする res, err := http.Get("https://golang.org") STEP-2: コードの変更 res, err := http.DoGet("https://golang.org") STEP-3: 旧APIの削除 問題なし!
  16. 16. 型の場合 16 type Applicant Client STEP-1: 新APIの追加 ■ http.Clientをリネームする ● メソッドが引き継げない ● キャストはできる 【方法1】型を作ってみる type Applicant struct { Client } 【方法2】埋め込んでみる ● メソッドは引き継げる ● キャストができない
  17. 17. Alias Declarations ■ 型のエイリアスを定義できる ● 完全に同じ型 ● キャスト不要 ● エイリアスの方ではメソッド定義はできない 17 type Applicant = http.Client ■ %Tは同じ元の型名を出す type Applicant = http.Client func main() { fmt.Printf("%T", Applicant{}) } http.Client
  18. 18. Quaternions 18 issue #19813
  19. 19. 19 4月1日でしたね
  20. 20. 標準ライブラリの変更 20
  21. 21. math/bits ■ ビット演算に便利なライブラリ ● #18616 にて提案 ● http://tip.golang.org/pkg/math/bits/ ● LenXX, OnesCountXX ● ReverseXX, ReverseBytesXX ● RotateLeftXX ● LeadingZerosXX, TrailingZerosXX 21 fmt.Printf("%d (%b) has %d bits set to onen", n, n, bits.OnesCount(n)) fmt.Printf("%d reversed is %dn", n, bits.Reverse(n)) fmt.Printf("%d can be encoded in %d bitsn", n, bits.Len(n))
  22. 22. sync.Map ■ スレッドセーフなマップ ● #18177 にて提案 ● http://tip.golang.org/pkg/sync/#Map ● ゼロ値で使える 22
  23. 23. sync.Mapのサンプル 23 var m sync.Map for i := 0; i < 3; i++ { go func(i int) { for j := 0; ; j++ { m.Store(i, j) } }(i) } for i := 0; i < 10; i++ { m.Range(func(key, value interface{}) bool { fmt.Printf("%d: %dt", key, value) return true }) fmt.Println() time.Sleep(time.Second) }
  24. 24. html/templateがより安全に 24 type Foo struct{ Bar string } func main() { tmpl, err := template.New("home").Parse(` <a title={{.Bar | html}}> `) if err != nil { log.Fatalf("could not parse: %v", err) } foo := Foo{"haha onclick=evil()"} if err := tmpl.Execute(os.Stdout, foo); err != nil { log.Fatalf("could not execute: %v", err) } } ■ 以下のコードでエラーが起きるようになった
  25. 25. os.Exec ■ 重複する環境変数を削除するように ● 一番うしろのものを優先する 25 func main() { cmd := exec.Command("./getenv", "foo") cmd.Env = append(os.Environ(), "foo=newbar") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { log.Fatal(err) } }
  26. 26. ランタイムの改善 26
  27. 27. ベンチマーク 27
  28. 28. ツール類の変更 28
  29. 29. コンパイラのエラーメッセージの改善 29 package main func main() { fmt.Println("that ain't gonna compile") } fail/main.go:4: syntax error: unexpected semicolon or newline before { fail/main.go:3:6: missing function body for "main" fail/main.go:4:1: syntax error: unexpected semicolon or newline before { Go1.8 Go1.9
  30. 30. コンパラの速度改善 ● リファクタによって改善 ● 一部を並行処理を採用することで改善 ○ https://golang.org/issue/17639 30
  31. 31. go testの改善 ■ 複数パッケージの場合にvendorを無視 ● https://golang.org/issue/19090 31 $ go test ./... ■ テスト関数一覧が出せるように ● https://golang.org/issue/17209 $ go test -test.list . TestIntegration TestEmbedStreams TestEmbedFiles
  32. 32. go doc ■ フィールドにリンクが貼れるようになった ● https://golang.org/issue/16753 ● https://tip.golang.org/pkg/net/http/#Client. Transport 32
  33. 33. Thank you! twitter: @tenntenn Qiita: tenntenn connpass: tenntenn 33

×