Go1.10のリリースパーティ@googleに参加したのでその参加メモ。 Go1.10はGo1.9から半年ぶりのリリース
URL | https://gocon.connpass.com/event/78128/ |
会場 | Google Tokyo |
日時 | 2018/02/20(火) 19:00 〜 22:00 |
What’s new Go1.10?
https://talks.godoc.org/github.com/dlsniper/talks/2018/go-1.10-release-party/presentation.slide#1
(スライドはUKで行われたリリースパーティのものを拝借)
Language Changes
- おおきいのなし。
- indexに定数を含んだシフトが出来るようになったり、コンパイラの挙動を言語仕様としてサポートした
- Go の定数の話
l, err := struct{io.Reader}.Read(m, dst)
なのがコンパイルできる(1.10だとまだpanic()
する)
Ports & OS Support
- OpenBSD 6.0、OS X 10.8 Mountain Lion、10.9 Mavericks、Windows7、Vistaがサポートされるのは1.10まで
Performance
- だいたいあがった
- 参考 Go got 15-20% faster in benchmark game with 1.10
Compiler & Tools
- デフォルトで
go build
、go test
がビルドキャッシュされるようになった。go build -i
とかしなくてもキャッシュされる。- ビルド時の環境変数なども記憶されている(環境変数が変わるとキャッシュが使われない)
- テストでキャッシュを使いたくないときは
-count=1
オプションをつける
- マルチパッケージのテストカバレッジが取得できるようになった
- WindowsではDLLをサポート。OSXではLinuxでしか使えていなかったプラグイン機能をサポート。
-asmflags
、-gcflags
、-gccgoflags
、-ldflags
オプションを引数で指定したパッケージのみに指定出来るようになったgofmt
の結果がいい感じになった。go fix
コマンドが追加(?)された。golang.org/x/net/context
をcontext
に変換したりコードのマイグレーションを助けてくれる。 -会場内でGo1.9のころからあった気がすると話になったが、1.9のリリースノートには確かにない。不思議。- platformのサポートがかなり増えた
Runtime
- LockOSThreadとUnlockOSThreadの仕様が変わった
- cgoとか使っている時に、OSのスレッドを固定する時につかうらしい。
みたいなスタックトレースは出なくなった。
CGO support
- cgoで直接goのstringが使えるようになった。
- 初期値(0 or nil)が変わる破壊的変更が入っているが、
go fix
で直せる
Standard Library
- 対象に埋込みポインタがあるようなときのjsonのUnmarshalの挙動に破壊的変更が入っている。
- math/rand.Shuffleとかmath.Roundが入った。
net.Conn
やnet.Listener
でClose
するとファイルディスクリプタのClose
も保証されるようになった- strings.Builderが追加された
- etc…
Session1: テストキャッシュについて
@timakin
https://speakerdeck.com/timakin/how-go-cache-tests
- Go1.10からテストをいい感じにキャッシュしてくれる。
- 渡された環境変数、ファイルに変更がないならば成功しているテストケースは
(cached)
と表示されパスされる -count=1
オプションでキャッシュを無視。キャッシュクリアはgo clean -cache
- デフォルト設定では、Macだと
$HOME/Library/Caches/go-build
にキャッシュされている。 - キャッシュされないオプションもある。ベンチマーク(
-bench
)系のオプションは当然キャッシュされない - 今はカバレッジプロファイルのオプションがキャッシュされないので、キャシュするようにするパッチを送っている
- リリース直後だし抜け漏れがあるかもしれないので他にもContributeチャンスあるかも。
Session2: Go 1.10 ツール周辺の CL を読む
Go 1.10 Release Party in Tokyo で go test, go vet に入った変更の話をしました
http://motemen.hatenablog.com/entry/2018/02/go110-vet
https://docs.google.com/presentation/d/1FXFve72MrTfWOyj4GRERRN1bY4eivymqx4Bojq7wQuQ/edit#slide=id.p
- CLというのはChange Listの略
- go-review.googlesource.comで見れるgerrit上のPRみたいなやつ。
- パッチを1コミットにまとめて取り込んでいるのでGoは
git log
が読みやすい。 - コミットメッセージにもCLのURLがあるから変更経緯やレビュー内容もすぐわかる
- コミットメッセージにもかなり丁寧に書いてある。
go test
やgo vet
を読んでみる。1.10からgo test
するとgo vet
が呼ばれるようになっている。(build → vet → test)go test
の前に行われるgo vet
は確実に間違っている種類(atomic bool buildtags nilfunc printf
)のみ- どうやって依存関係の解決を確実にしているかというと、
go vet
にvet.cfg
を渡してcgoの型情報とかを設定できるようになった。build
フェーズで行ったもろもろのマッピングをgo vet
に渡して正しいgo vet
がただしくできるように。
- なので
importer.Lookup
というメソッドが増えている。渡されたpathを良い感じに探す go build
できるけどgo/types
(go vet
)のチェックは通らないコードもある
Session3: Go1.10 strings.Builder の紹介
@knsh14
https://speakerdeck.com/knsh14/go1-dot-10-strings-dot-builder-falseshao-jie
- strings.Builder。1.10から入った新しいデータ型
- 幾つかの文字列をまとめるときに使う。結構他の言語あるやつ
- io.Readerは実装していないし、初期値も与えない。ただ本当に文字列をまとめるだけ。
bytes.Buffer
からstringを取り出すときに発生するアロケーションをなくしたい。- 実際にパフォーマンスを測ってみると…
- n回WriteStringして一度だけString()するようなパターンの場合は事前にGrowでcapを増やしておく必要がありそう
- どう使い分けるか?
- どのくらいbufferに書き込むか事前にわからない場合はbytes.Bufferのほうが少し有利
- String()を何回も呼ぶ必要がある場合はstrings.Builder
- 事前に書き込むわかっている場合はstrings.Builder
- 副作用がおきないようにコピーされている検知する仕組みが入っている。
noescape
を使ったパフォーマンス向上などもされている
Session4: GoDocについて
- GoDocはいろいろあって、4つ実装がある。
- go doc
- godoc (CLI)
- godoc -server(HTTPサーバ)
- (最後のひとつはメモ取り忘れた…)
- Golang Philosophy。ちゃんとコメントとかあること。
- 基本的なルールとして空白行なしでコメントを書くこと。大文字で始めるPublicなものにすること。
- シンボルを書いておかないといけないのはgrepとかで引っかかるから -リポジトリのURLとか依存先はgodoc.orgにしかない。
- マークアップは5つしかつかえない。
- godoc.org上だと
RFC XXX
って書くだけで対応するRFCにリンクされる Example Test
も書ける。- godocの更新タイミング
- 初回のアクセス
- ページの最後にあるRefresh now.というリンクをクリックする
- リポジトリをpushしても更新されないので注意。
- ローカルで
godoc -server
するときはいろいろ拡張オプションが使える-play
、-index
など。静的解析やパッケージのコールグラフも生成できる。
- ローカルで実行するときは自作テンプレートも当てられるので、godoc/staticの下のテンプレートを拡張してつかえる
質疑応答の中で出たのだが、ローカルに立ち上げたGodocでplaygroudをするときは、 playground用のサーバも立ち上げておかないと自作ライブラリなどのimportなどが解決できないらしい。
Session5: gRPC clientツールのktr/evansについて
ktr/evans
https://github.com/ktr0731/evans
- 実はバージョンによってgRPCの"g"の意味は変わるらしい。
- 1.9.0はコードネームglossy
- gRPCはAPIのデバッグがしづらいあるある
- 幾つかあるgRPCのクライアントツール
- polyglot https://github.com/grpc-ecosystem/polyglot
- オプションの指定が大変なのとJavaが必要
- grpcc https://github.com/njpatel/grpcc
- nodeが必要
- grpcurl https://github.com/fullstorydev/grpcurl
- 先日出たばかりなのでここでは名前だけ
- polyglot https://github.com/grpc-ecosystem/polyglot
- あまりピンと来ないので自作した。
- デバッグ、テストで使えるREPLモード
- 補完も効く!
- スクリプトファイル内で使えるコマンドラインモード
- gRPC-Webなどはまだ未対応
- 発表用のデモは以下
Session7: Goでカウンタを作った話
言及されていないが、内容的にこれの話
pvpool〜メルカリの商品閲覧数カウントアップの裏側〜
- Goでカウンタを作った話。
- 全ての商品に閲覧数をつけるとページビューはどうなるか。
- 読み込み処理だったページビューが書き込み処理になる。瞬間に非同期処理で大変になる。
- ハイスループットでリアルタイム処理をする必要があり、Goで実装してみた。
- 処理を一旦Storerというモジュールでまとめてデータベースの負荷を下げる。
- また、複数のSlot(複数存在するQueueモジュール)に同じ商品IDが入らないようにしておく。
- ロギングはzapだとオーバーヘッドほとんど気にしなくてよい。
- Goでデータベースを触るときは
OpenConns
、IdeleConns
、MaxLifeTime
を適切に決めておくこと- methaneさんの解説がわかりやすい、
- http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
その他
Goconは4月半ば予定。。。!
感想
新しい大きな言語仕様の追加はなかったが、tools周りがしっかり強化されているのがわかるパーティだった。
最近gRPCを少し触り始めたので、ktr0731/evansは衝撃的。
ktr0731/evansを作ったきたろーさんが、自分にGoを教えてくれた柴田さんがたまにつぶやいている「優秀なインターンさん」だったのも衝撃的。
ビルドもテストも早くなったしガンガンGo書けるというか書くぞ!