func worker(exitChan chan struct{}) {
LOOP:
for {
fmt.Println("worker")
time.Sleep(time.Second)
select {
case <-exitChan: // 等待接收上级通知 (Waiting to receive notification from the higher level)
break LOOP
default:
}
}
wg.Done()
}
LOOP是什么?
LOOP 是 Go 语言中的一个标签(label),用于标记循环语句。它由用户定义的标识符后跟一个冒号(:)构成。在这段代码中,使用标签的目的是为了同时跳出内部的 select 语句和外部的 for 循环。
在给定的代码片段中,LOOP 标签与 select 语句中的 break 语句一起使用:
LOOP:
for {
// ...
select {
case <-exitChan:
break LOOP
// ...
}
}
当执行 break LOOP 语句时,会跳出 select 语句和被标记为 LOOP 的 for 循环。这使得 goroutine 可以退出循环,并继续执行循环外的 wg.Done() 调用。
如果没有使用 LOOP 标签,break 语句只会跳出 select 语句,而 goroutine 将继续执行下一次 for 循环的迭代。