Rumah > Artikel > pembangunan bahagian belakang > Adakah terdapat kemungkinan panik di sini?
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 } } }
Mungkinkah saya akan panik apabila branch1 berlaku antara line2 dan line3.
Ya, panik mungkin. Di bawah ialah contoh garis masa di mana panik berlaku. Baris disusun mengikut urutan masa menaik. N: awalan bermaksud goroutine.
1: Mulakan coroutine 2
2: Panggil ctx.Err(), ia mengembalikan sifar
1: Panggil cancelFunc()
1: Tutup saluran anis
2: Hantar ke saluran aniy. Panik kerana saluran ditutup.
Atas ialah kandungan terperinci Adakah terdapat kemungkinan panik di sini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!