/home/by-natures/dev*

ソフトウェア開発者としての技術的なメモと、たまに普通の日記。

2018/10/11 Go言語の例外処理と同期処理

今日通勤中に、重い荷物を持った女性がいたので階段の上に運ぶのを手伝ったのですが、日本語が通じず、"Shall I help you?" というと「ありがとうございます」と返事がありました。荷物を運んでいると、「你是中国人吗?」(中国人ですか?)と言われたので、「我是日本人,我学汉语」(日本人です、中国語を学んでいます)と言うと笑っていました。中国のどこの地域か分からないのですが、彼女の中国語は優しいイントネーションでした。

今年の春にフィンランドに行ったのですが、フィンランドは白人の方しかほぼおらず、アジア人はどうしても目立ちます。夏にシンガポールに行った時、周りにアジア人が多く居心地の良いこと。外見が似ているというのはこれほど安心するものなのかと驚き、やはり自分はアジア人なんだなぁと実感しました。フィンランドでは隣国の言語と英語の3ヶ国語以上話せるのが普通らしく、せめて自分も中国語を少し話せるようになりたいなと思って勉強していたので、初めて外で中国語を使うことができて嬉しかったです。

外国語学習を通じてその国の文化を知って、たまに生活の中で役立てばよいなぁという気分です。

例外処理について

例外処理の機構は Go 言語には明示的に用意されていないようで、必要があれば返り値として返却するだけというシンプルな設計です。

一応 panic(v interface{}) でランタイムエラーを発生させ、その際でも defer されているメソッドはコールされるので、 defer されているメソッドの中で recover() メソッドを取得することで panic を止めることが可能なようです。

panic() の引数に独自に作ったエラー型を仕込むことで Java などで書ける例外処理のようなことは出来そうですが、あまり推奨されていない様子でした。defer だらけになるのが容易に想像できるので可読性低そうですし、panic は基本的に避ける、エラーは返り値として扱うというのが良いようです。

なぜGo言語はエラー返却に例外機構を使わないのか - 嵐の小舟より

qiita.com

同期処理について

複数のゴルーチンの終了を待つ方法について。sync パッケージの WaitGroup を使えば良さそう。Tour of Go をやった後だと、チャネルで頑張るのかと思ってたけど、便利なライブラリがあってよかった。

メソッド終了時に必ず呼んでほしい処理を Go 言語では wg.Done() のように書けるのが便利ですね。Java 7 以降だと AutoClosable があるので明示的に close する必要がなく、I/O 処理が書きやすくなりましたが、Go と比べたらネストが一段深くなるのには変わりないですし。でも for 文でブロックを作ることで特定のリソースを使っているという緊張感もあるので、それはそれで良いのかもしれない。。

How to Wait for All Goroutines to Finish Executing Before Continuing | I care, I share, I'm Nathan LeClaire.