Dalam kod yang disediakan, kes tamat masa dilaksanakan menggunakan pernyataan pilih dan panggilan masa.After(). Walau bagaimanapun, kes tamat masa tidak dapat dilaksanakan.
Sebabnya ialah fungsi time.After() mencipta saluran baharu setiap kali ia dipanggil. Apabila penyataan pilih menerima nilai daripada saluran c1 (dalam gelung pertama), saluran masa sedia ada. Selepas() dibuang. Oleh itu, kes tamat masa tidak pernah mempunyai peluang untuk menerima nilai.
Untuk menyelesaikan isu ini, cipta saluran masa.After() sekali sahaja, di luar gelung for. Ini memastikan saluran yang sama digunakan untuk kes tamat masa sepanjang pelaksanaan.
Berikut ialah kod yang diubah suai:
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
Dengan pengubahsuaian ini, kes tamat masa akan dilaksanakan dengan jayanya selepas 2 saat , selagi tiada nilai diterima daripada saluran c1 dalam tempoh masa tersebut.
Atas ialah kandungan terperinci Mengapa Kes Tamat Masa Golang Saya Tidak Dicetuskan Apabila Menggunakan Saluran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!