我正在使用带有标签的无限循环。在 for 循环的范围之外,我有一个作为 go 例程运行的预定函数。当满足某个条件时,我想从预定函数中中断 for 循环。我怎样才能做到这一点?这就是我正在尝试的,由于范围问题,这显然不起作用。
package main
import (
"fmt"
"time"
"sync"
)
func main() {
count := 0
var wg sync.WaitGroup
wg.Add(1)
t := time.NewTicker(time.Second*1)
go func (){
for {
fmt.Println("I will print every second", count)
count++
if count > 5 {
break myLoop;
wg.Done()
}
<-t.C
}
}()
i := 1
myLoop:
for {
fmt.Println("iteration", i)
i++
}
wg.Wait()
fmt.Println("I will execute at the end")
}
Run Code Online (Sandbox Code Playgroud)
建立信号通道。
quit := make(chan struct{}{})
Run Code Online (Sandbox Code Playgroud)
当你想打破一个循环时关闭它。
go func (){
for {
fmt.Println("I will print every second", count)
count++
if count > 5 {
close(quit)
wg.Done()
return
}
<-t.C
}
}()
Run Code Online (Sandbox Code Playgroud)
在关闭的通道上读取立即返回零值(但在这种情况下我们不需要它)。否则从中读取块并选择将执行传递到“默认”情况。
myLoop:
for {
select {
case <- quit:
break myLoop
default:
fmt.Println("iteration", i)
i++
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11156 次 |
| 最近记录: |