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
Patricia Arquetteasal
2024-12-18 11:38:15890semak imbas

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()
}

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!

Kenyataan:
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