My External Storage

Feb 22, 2018 - 8 minute read - Comments - go report

Go 1.10 Release Party in Tokyo参加メモ #go110party

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?

@tenntenn

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

Compiler & Tools

  • デフォルトでgo buildgo testがビルドキャッシュされるようになった。
    • go build -iとかしなくてもキャッシュされる。
    • ビルド時の環境変数なども記憶されている(環境変数が変わるとキャッシュが使われない)
    • テストでキャッシュを使いたくないときは-count=1オプションをつける
  • マルチパッケージのテストカバレッジが取得できるようになった
  • WindowsではDLLをサポート。OSXではLinuxでしか使えていなかったプラグイン機能をサポート。
  • -asmflags-gcflags-gccgoflags-ldflagsオプションを引数で指定したパッケージのみに指定出来るようになった
  • gofmtの結果がいい感じになった。
  • go fixコマンドが追加(?)された。golang.org/x/net/contextcontextに変換したりコードのマイグレーションを助けてくれる。 -会場内でGo1.9のころからあった気がすると話になったが、1.9のリリースノートには確かにない。不思議。
  • platformのサポートがかなり増えた

Runtime

  • LockOSThreadUnlockOSThreadの仕様が変わった
    • cgoとか使っている時に、OSのスレッドを固定する時につかうらしい。
  • みたいなスタックトレースは出なくなった。

CGO support

  • cgoで直接goのstringが使えるようになった。
  • 初期値(0 or nil)が変わる破壊的変更が入っているが、go fixで直せる

Standard Library

  • 対象に埋込みポインタがあるようなときのjsonのUnmarshalの挙動に破壊的変更が入っている。
  • math/rand.Shuffleとかmath.Roundが入った。
  • net.Connnet.ListenerCloseするとファイルディスクリプタの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 を読む

@motemen

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 testgo vetを読んでみる。1.10からgo testするとgo vetが呼ばれるようになっている。(build → vet → test)
  • go testの前に行われるgo vetは確実に間違っている種類(atomic bool buildtags nilfunc printf)のみ
  • どうやって依存関係の解決を確実にしているかというと、go vetvet.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について

@shibu_jp

  • GoDocはいろいろあって、4つ実装がある。
  • 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

ktr/evans
https://github.com/ktr0731/evans

Session7: Goでカウンタを作った話

@bokko

言及されていないが、内容的にこれの話
pvpool〜メルカリの商品閲覧数カウントアップの裏側〜

  • Goでカウンタを作った話。
  • 全ての商品に閲覧数をつけるとページビューはどうなるか。
    • 読み込み処理だったページビューが書き込み処理になる。瞬間に非同期処理で大変になる。
  • ハイスループットでリアルタイム処理をする必要があり、Goで実装してみた。
  • 処理を一旦Storerというモジュールでまとめてデータベースの負荷を下げる。
  • また、複数のSlot(複数存在するQueueモジュール)に同じ商品IDが入らないようにしておく。
  • ロギングはzapだとオーバーヘッドほとんど気にしなくてよい。
  • Goでデータベースを触るときはOpenConnsIdeleConnsMaxLifeTimeを適切に決めておくこと

その他

Goconは4月半ば予定。。。!

感想

新しい大きな言語仕様の追加はなかったが、tools周りがしっかり強化されているのがわかるパーティだった。
最近gRPCを少し触り始めたので、ktr0731/evansは衝撃的。
ktr0731/evansを作ったきたろーさんが、自分にGoを教えてくれた柴田さんがたまにつぶやいている「優秀なインターンさん」だったのも衝撃的。
ビルドもテストも早くなったしガンガンGo書けるというか書くぞ!

関連記事