### break是break的select还是for呢?那return呢?除了做实验有什么方法可以看到这两个关键字的区别与用法
```
...
go func(wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
case resGt := <-ch2:
if resGt > 28 {
fmt.Println("bug:lwq")
return
}
fmt.Println(resGt)
}
}
}(&wg)
...
```
后来又看了一下:
select中的break写不写没有关系,因为golang在select中的case执行完毕之后会自动执行break。单独使用select中的break可用于判断条件后的提前break
select一般和for一起使用,想要在select中的case中直接跳出break,需要搭配label使用,这样比较方便简洁,demo如下:
```
func kk() {
SELECT:
for {
select {
case <-time.After(time.Second):
fmt.Println("一秒后退出")
//break 跳出select
break SELECT //带标签的break,实际上跳出到select外层的for语句块
case <-time.After(time.Second * 10):
fmt.Println("十秒后退出")
break
}
}
fmt.Println("select 语句结束")
}
```
#4
更多评论
break是针对for的,直接跳出循环。
return是针对函数,直接终止运行当前函数。
select没有此类对应的关键字。
做实验已经是一个比较好直观观察到现象的方法了。
#1
不好意思,上面说break一定是针对for跳出循环是不对的。
应该是break包在select里面就是针对select的,不是的话则是针对for的,应该是一个作用域问题
return的话不管在哪里都是直接终止函数,demo如下:
```
package main
import (
"fmt"
"time"
)
var ch = make(chan int, 100)
func main() {
ch <- 98
ch <- 98
hh()
fmt.Println("函数执行结束")
time.Sleep(10 * time.Second)
}
func hh() {
ticker := time.NewTicker(2 * time.Second)
for {
fmt.Println("is for")
select {
case <-ch:
fmt.Println("is select")
break //这里是针对select
case <-ticker.C:
fmt.Println("ticker")
return
}
fmt.Println("select 之后")
break //这里是针对for
}
}
```
#2