### 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)
...
```
不好意思,上面说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
更多评论
break是针对for的,直接跳出循环。
return是针对函数,直接终止运行当前函数。
select没有此类对应的关键字。
做实验已经是一个比较好直观观察到现象的方法了。
#1
2楼 <a href="/user/ysh_77" title="@ysh_77">@ysh_77</a> 谢谢回复,很详细。我再补充点注释。
```
package main
import (
"fmt"
"time"
)
var ch = make(chan int, 100)
func main() {
ch <- 98
ch <- 99
testBreakScope()
fmt.Println("main 函数执行结束")
time.Sleep(3 * time.Second)
}
func testBreakScope() {
var counter int
defer func() {
fmt.Println("func testBreakScope 结束")
}()
ticker := time.NewTicker(10 * time.Nanosecond)
for {
counter++
fmt.Println("for 中执行第", counter, " 次")
select {
case i := <-ch:
fmt.Println("1===命中第一个case,值为:", i, " 触发select里的break")
break //这里是针对select,还会执行到select之外的内容
case <-ticker.C:
fmt.Println("3===计时器到期执行case,触发select里的return")
return //这里是针对整个函数,只会执行defer中的内容
}
fmt.Println("select已经退出,触发select外的break ")
break //这里是针对for,还会执行到for之外的内容
}
fmt.Println(" 跳出for第", counter, "次")
}
```
#3