Slide 29
Slide 29 text
実装の詳細(Go1.14)
29
func parentCancelCtx(parent Context) (*cancelCtx, bool) {
done := parent.Done()
if done == closedchan || done == nil {
return nil, false
}
p, ok := parent.Value(&cancelCtxKey).(*cancelCtx)
if !ok {
return nil, false
}
p.mu.Lock()
ok = p.done == done
p.mu.Unlock()
if !ok {
return nil, false
}
return p, true
}
• 新しくContextのValue()を用いるよ
うになっています。後述しますが、これ
でカスタムコンテキストの場合でもキャ
ンセル可能なコンテキスト(cancelCtx)を
探索できるようになります。
• Done()メソッドをカスタム実装してい
る場合はゴルーチンを生成しない対象
外(チャネル値は同じmakeの呼び出しで生成された場
合 or nil の場合のみ一致)
✓ CLではparentCancelCtx関数が全体的に書き換わっています。