← Go コース
54. context — キャンセルとタイムアウトを伝える
context パッケージは、処理のキャンセルや締め切り(デッドライン)を、関わる goroutine の連鎖に伝えるための仕組みです。慣習として関数の第1引数に ctx context.Context を取り、context.WithCancel や context.WithTimeout で派生コンテキストを作ります。
ctx.Done() は、キャンセルされたかタイムアウトした瞬間に閉じられる受信用チャネルを返します。goroutine 側はこれを select で待ち、閉じられたら処理を打ち切ります。ctx.Err() でキャンセルされたのか期限切れなのかを区別できます。WithTimeout が返す cancel は defer で必ず呼んでリソースを解放します。
下の例では 50 ミリ秒のタイムアウトを設定し、worker は完了か期限切れのどちらか早い方で終わります。worker が即座に結果を返すため、出力は毎回同じになります。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Go