地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Go】Go言語のcontextの理解メモ

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{}