select中的break和return

yaxiaomu · · 1578 次点击
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
2楼 <a href="/user/ysh_77" title="@ysh_77">@ysh_77</a> 谢谢回复,很详细。我再补充点注释。 ``` package main import ( &#34;fmt&#34; &#34;time&#34; ) var ch = make(chan int, 100) func main() { ch &lt;- 98 ch &lt;- 99 testBreakScope() fmt.Println(&#34;main 函数执行结束&#34;) time.Sleep(3 * time.Second) } func testBreakScope() { var counter int defer func() { fmt.Println(&#34;func testBreakScope 结束&#34;) }() ticker := time.NewTicker(10 * time.Nanosecond) for { counter++ fmt.Println(&#34;for 中执行第&#34;, counter, &#34; 次&#34;) select { case i := &lt;-ch: fmt.Println(&#34;1===命中第一个case,值为:&#34;, i, &#34; 触发select里的break&#34;) break //这里是针对select,还会执行到select之外的内容 case &lt;-ticker.C: fmt.Println(&#34;3===计时器到期执行case,触发select里的return&#34;) return //这里是针对整个函数,只会执行defer中的内容 } fmt.Println(&#34;select已经退出,触发select外的break &#34;) break //这里是针对for,还会执行到for之外的内容 } fmt.Println(&#34; 跳出for第&#34;, counter, &#34;次&#34;) } ```
#3