Lapis Lazuli

technical blog for web developer

【Go】contextの使い方を学ぶ

今回は久しぶりにGoについての話を。
Goにはcontextという、android開発でよく使われるものと全く同じ名前のパッケージがあります。
直訳すると文脈という意味なのですが・・・正直何のこっちゃと感じると思います。

contextの機能

概要は公式ドキュメントに書いてある通りです。

golang.org

色々と書いてありますが、goroutineを一括で制御するパッケージだと思って頂ければ理解しやすいのではないでしょうか(ざっくり)
この中で僕が使えるな、と思ったのはキャンセル。
外部からキャンセルする方法は無い(挙動の制御はchannel使えばある程度は出来る)ので重宝するかなと。

使い方

宣言はBackGroundを使います。

ctx := context.Background()

キャンセルはWithCancelを使います。

ctx, cancel := context.WithCancel(context.Background())

contextを渡してあげると、子contextとキャンセル関数が帰ってきます。
あとはcontextをgoroutine宣言するときに渡してあげて、関数の引数に定義しておくだけです。

cancel()

そしてキャンセルを呼び出すだけでcontextを渡したgoroutineがキャンセルされます。
その場合はDone()で閉じられるチャネルを返すようになっています。

更に便利なのが、このgoroutineに渡すcontextは入れ子構造にすることが出来て・・・親をキャンセルするとそれが伝播して伝わっていくようになっています。

どうでしょう。使い所によっては、かなり強力な機能ではないでしょうか。

まとめ

goは次の職場でメインで使う事になるので、色々とテクニックは網羅しておきたいなぁと思いました。
特にチャネルを組み込んだgoroutineの使い方はマスターしようと決心しました。