func main() { rand.Seed(time.Now().Unix()) ctx, cancelFunc := context.WithCancel(context.Background()) anies := make(chan any) go doSomething(ctx, anies) intn := rand.Intn(2) if intn == 0 { //BRANCH1 cancelFunc() close(anies) } time.Sleep(time.Second) } func doSomething(ctx context.Context, anies chan any) { for { if ctx.Err() == nil { //LINE2 anies <- 1 //LINE3 } } }
Line2와 Line3 사이에 Branch1이 발생하면 패닉이 올 수 있나요?
네, 패닉이 가능합니다. 다음은 패닉이 발생한 타임라인의 예입니다. 행은 시간의 오름차순으로 정렬됩니다. N: 접두사는 고루틴을 나타냅니다.
1: 코루틴 2 시작
2: ctx.Err()을 호출하면 nil을 반환합니다
1: cancelFunc()
를 호출하세요.
1: anis 채널 닫기
2: 모든 채널로 보냅니다. 채널이 닫혀 있어서 당황하세요.
위 내용은 여기에 패닉이 발생할 가능성이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!