Golang:如何从循环外停止执行 for 循环?

Man*_*ngh 5 go

我正在使用带有标签的无限循环。在 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)

Dar*_*aaz 5

建立信号通道。

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)