Rumah > pembangunan bahagian belakang > Golang > Mengapa Kes Tamat Masa Golang Saya Tidak Dicetuskan Apabila Menggunakan Saluran?

Mengapa Kes Tamat Masa Golang Saya Tidak Dicetuskan Apabila Menggunakan Saluran?

Patricia Arquette
Lepaskan: 2024-12-18 11:38:15
asal
816 orang telah melayarinya

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

Kes Tamat Masa Tidak Dicetuskan di Golang dengan Saluran

Dalam kod yang disediakan, kes tamat masa dilaksanakan menggunakan pernyataan pilih dan panggilan masa.After(). Walau bagaimanapun, kes tamat masa tidak dapat dilaksanakan.

Penjelasan

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.

Penyelesaian

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()
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan