在这个例子中,我们将永远退出循环,并在循环之外继续进行下一步,而不是终止整个过程。
应用
这个例子永远循环下去,永远不会到达fmt.Println("main: end") 行。如果你在fmt.Println("timeout") 之后使用os.Exit(0) ,它将直接退出应用程序:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main: start")
for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
}
}
fmt.Println("main: end")
}
main: start
timeout
timeout
timeout
timeout
...
...
解决方案1
这是首选的解决方案,它是基于Labels的:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main: start")
Loop:
for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
break Loop
}
}
fmt.Println("main: end")
}
main: start
timeout
main: end
解决方案2
这使用了一个匿名函数/封闭:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("main: start")
func() {
for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
return
}
}
}()
fmt.Println("main: end")
}
main: start
timeout
main: end