我需要读取UDP流量,直到达到超时为止。我可以通过在UDPConn上调用SetDeadline并循环直到出现I / O超时错误来做到这一点,但这似乎有些破绽(基于错误条件的流控制)。以下代码段似乎更正确,但不会终止。在生产中,这显然将在goroutine中执行;为了简单起见,它被编写为主要功能。
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,我希望上面的代码,选择默认的情况下,持续一秒钟,然后采取第一种情况并跳出循环。我如何修改上面的代码片段以达到所需的循环和读取效果,直到发生超时?
只需从循环time.After外部分配通道for,否则每次循环时将只创建一个新计时器。
time.After
for
例:
func main() { ch := time.After(time.Second * 1) L: for { select { case <-ch: fmt.Printf("Finished listening.\n") break L // have to use a label or it will just break select default: fmt.Printf("Listening...\n") //read from UDPConn here } } }
请注意,这在操场上不起作用。