contextの主な用途は2つ
- Goroutineの適切なキャンセル
- リクエスト情報の伝搬
1つめはコンテキスト使わなくても実装可能だが2つめがちょっと難しい。そもそもコンテキスト型とは以下のように定義されている。
type Context interface { // Deadlineが設定されている場合はその時刻を返却。ok==falseの時は未設定 Deadline() (deadline time.Time, ok bool) // このコンテキストがキャンセルされたりタイムアウトした場合にcloseされます。 Done() <-chan struct{} // Doneチャンネルが閉じた後なぜこのコンテキストがキャンセルされたかを知らせます。 Err() error // Valueはkeyに紐付いた値を返し、設定した値がない場合はnilを返します。 Value(key interface{}) interface{} }
以下はgoのイディオムで送信されるデータに意味がないときに使うらしい。
<-chan struct{}