我需要讀取UDP流量,直到達到超時。我可以通過調用UDPConn上的SetDeadline並循環,直到出現I/O超時錯誤,但這似乎是hack-ish(基於錯誤條件的流量控制)。下面的代碼片段似乎更正確,但不會終止。在生產中,這顯然將在一個公用事業中執行;爲了簡單起見,它被寫爲主要功能。如何在達到超時之前讀取UDP連接?
package main
import (
"fmt"
"time"
)
func main() {
for {
select {
case <-time.After(time.Second * 1):
fmt.Printf("Finished listening.\n")
return
default:
fmt.Printf("Listening...\n")
//read from UDPConn here
}
}
}
爲什麼給定的程序沒有終止?基於https://gobyexample.com/select,https://gobyexample.com/timeouts和https://gobyexample.com/non-blocking-channel-operations,我期望上面的代碼選擇默認情況下一秒鐘,然後採取第一種情況並跳出循環。如何修改上面的代碼片段以達到循環和讀取所需的效果,直到發生超時?
如果您將'break'更改爲'return',則該功能將在持續時間內完成。您目前正在循環使用,並且每秒都會打印完成。 – cdbitesky 2014-09-28 02:36:58
@chendesheng我相信時間的使用。以後是慣用的(請參閱http://golang.org/pkg/time/#example_After) 感謝你們兩人對break語句的理解;我更新了片段。該程序仍然沒有終止,但 – cqcallaw 2014-09-28 02:43:55
@chendesheng我忘了提及:我曾嘗試使用time.Tick來代替,但仍然有無限循環行爲 – cqcallaw 2014-09-28 02:55:29