おわりに
というわけで、contextに関連する事項をまとめて紹介してきましたが、いかがでしたでしょうか。
contextは、database/sql
やnet/http
のように現実の事象と対応している何かが存在するパッケージではないので、イマイチその存在意義や使い方がわかりにくいと思います。
そういう方々に対して、contextのわかりやすいユースケースや、使用の際の注意点なんかを伝えられていれば書いてよかったなと思います。
コメントによる編集リクエスト・情報提供等大歓迎です。
連絡先: 作者Twitter @saki_engineer
参考文献
書籍
書籍 Go言語による並行処理
Goを書く人にはお馴染みの並行処理本です。
4.12節がまるまるcontext
パッケージについての内容で、advancedな具体例をもとにcontextの有用性について記述しています。
書籍 Software Design 2021年1月号
Go特集の第4章の内容がcontextでした。
こちらについては、本記事ではあまり突っ込まなかった「キャンセル処理を行った後に、コンテキスト木がどのように変化するのか」などというcontextパッケージ内部の実装に関する話についても重点的に触れられています。
ハンズオン
ハンズオン 分かるゴールーチンとチャネル
tenntennさんが作成されたハンズオンです。
STEP6にて、実際にcontext.WithCancel
を使ってcontextを作ってキャンセル伝播させる、というところを体験することができます。
The Go Blog
Go Concurrency Patterns: Context
てっとり早くcontext4メソッドについて知りたいなら、このブログを読むのが一番早いです。
記事の後半部分ではGoogle検索エンジンもどきの実装を例に出して、contextが実際にどう使われるのかということをわかりやすく説明しています。
Contexts and structs
「contextを構造体フィールドに入れるのではなく、関数の第一引数として明示的に渡すべき」ということに関して、1記事丸々使って論じています。
Go Concurrency Patterns: Pipelines and cancellation
この記事の中にはcontextは登場しませんが、Done
メソッドにおける「chan struct{}
を使ってキャンセル伝播する」という方法の元ネタがここで登場しています。