我需要读取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