Slide 1

Slide 1 text

Go 2のドラフトを読む ~エラー処理編~ by @take-cheeze

Slide 2

Slide 2 text

自己紹介 - 普段はRails書いておいります - Golangは、パッケージ管理がだるいときに書きます - フロントエンドではElmはいいぞって言って異端扱い

Slide 3

Slide 3 text

Golangの二大よく言われるやつ - Golang 2で改善される予定らしい - エラー処理だるい - interface{} のチェックがガバガバ(または多相型くれ) - 両方ざっくり読んでるけど、今回はエラー処理の方 - 今回は読書感想文なので気構えず - 公式ドキュメントやRFCは読むと楽しいのでおすすめ

Slide 4

Slide 4 text

タッチバーの正しい使い方 - https://twitter.com/NateTheFinch/status/899730215957561344 - タッチバー付きの機種持っていない - ルガーランスはちゃんと刺してから使いましょう

Slide 5

Slide 5 text

案の構成 1. 問題提起 a. 問題点 b. 他の言語での解決方法 2. 案 a. checkキーワード b. handleキーワード c. 既定ハンドラー

Slide 6

Slide 6 text

現状のエラー処理の問題点 - 定型処理のくせに長い - `if err != nil { return err }` を多値返却のエラー確認の度に書く - 更にgofmtすると3行になって、本来の処理より長くなることが - エラーチェックがけっこう漏れる - 戻り値のチェックをしなくても怒られない - エラーは基本的に全部して、必要のないものから除外する方が後々、楽

Slide 7

Slide 7 text

他の言語での例 - Rust - 関数型言語っぽい安全方向にふっている - エラー確認をしないと結果が取り出せない - Swift - 既存の例外処理っぽさがある( catchしないといけない) - 例外処理のめんどくさいところをだいぶなくしてる - バランスとってる感じ? - Rustに寄せようとしてるところも?

Slide 8

Slide 8 text

案 - 構文とキーワードが2つ追加 - エラー処理を記述する handle - エラー確認を展開する check - `handle` が宣言されない場合のエラーハンドラー

Slide 9

Slide 9 text

handle文 - 例外処理でcatch文に書いていることを書く - エラーにスタック情報のメタデータを追加するときに利用 - 連鎖させることができる - 宣言順の逆順に実行(スタック構造) - returnで先に宣言されたものを上書き可能 - 特に宣言のない場合、既定のに - ゼロ初期化の他の戻り値 - 最後の戻り値だけエラー返却

Slide 10

Slide 10 text

check式 - checkに続く式の最後の戻り値を判定する - foo(check bar())みたいな書き方も可能 - この場合、bar()の戻り値をチェックしてから foo()が呼ばれる - 書いてあった展開例がわかりやすい - 構文を見る限り、checkは単項演算子扱い - 更に単項演算子を重ねられる - *(check foo())みたいな逆参照を使う書き方をできる

Slide 11

Slide 11 text

雑感 - 短く書けるのは単純に嬉しい - handle文の連鎖ははまりそう - Rustのmatch式でreturnできるのやっぱりずるい - RAII的な処理が大変そうだけど - コンパイラつよい - 暗黙のチェックがやはり弱そう(そうゆう言語なので

Slide 12

Slide 12 text

おまけ: Go 2 Draft Designs フィードバック会 - 9/27に日本でやっていたらしい - フィードバック結果を読んでも楽しかった - エラー値&エラーハンドリング : http://bit.ly/go2-error-feedback-ja - ジェネリクス: http://bit.ly/go2-contracts-feedback-ja - 日本語で識者の意見を読めるのは有意義