Concurrency
context: cancelされたcontextはcontext.Canceledを返す
contextのキャンセルはDoneチャネルを閉じ、Errからcontext.Canceledとして観測できます。
Sourcecancel.go
Go 1.22
package contextflow
import "context"
func WaitForCancel(ctx context.Context) error {
<-ctx.Done()
return ctx.Err()
}Testcancel_test.go
Go 1.22
package contextflow
import (
"context"
"testing"
)
func TestCancelしたcontextはcontextCanceledを返す(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
cancel()
if got := WaitForCancel(ctx); got != context.Canceled {
t.Fatalf("WaitForCancel() = %v, want %v", got, context.Canceled)
}
}01Assertion
このテストで確認できること
- cancelを呼ぶとDoneが閉じる
- 待機していた処理はcontext.Canceledを返す
リクエストの中断やタイムアウトを下流へ伝えるにはcontextを第一引数として渡します。ループやI/O境界でDoneとErrを確認します。
OBSERVED RESULT
cancel()
<-ctx.Done()
ctx.Err() → context canceled