在Golang中用标签和匿名函数打破一个永远的循环

178 阅读1分钟

在这个例子中,我们将永远退出循环,并在循环之外继续进行下一步,而不是终止整个过程。

应用

这个例子永远循环下去,永远不会到达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