在提供的程式碼中,使用 select 語句和 time.After() 呼叫實作逾時情況。但是,超時情況並沒有被執行。
原因是 time.After() 函數每次呼叫時都會建立一個新通道。當 select 語句從 c1 通道接收到值時(在第一個 for 迴圈中),現有的 time.After() 通道將會被丟棄。因此,超時情況永遠沒有機會接收值。
要解決此問題,只需在 for 迴圈之外僅建立一次 time.After() 通道。這樣可以確保在整個執行過程中逾時案例使用相同的通道。
修改後的程式碼如下:
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() }
透過此修改,逾時案例將在 2 秒後成功執行,只要在該時間範圍內沒有從 c1 通道接收到任何值。
以上是為什麼我的Golang超時案例在使用通道時沒有觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!