1. for {
  2. select {
  3. case <-endChan:
  4. break
  5. case task := <-taskChan:
  6. log.Printf("写进程,%+v\n", task)
  7. data = append(data, [2]int{task.xf, task.yf})
  8. }
  9. }

这里的break并不能跳出for循环,要修改成如下

  1. FOR:for {
  2. select {
  3. case <-endChan:
  4. break FOR
  5. case task := <-taskChan:
  6. log.Printf("写进程,%+v\n", task)
  7. data = append(data, [2]int{task.xf, task.yf})
  8. }
  9. }

for-select中的break、continue和return

break

  • select中的break,类似c系列中的break,break后的语句不执行
  • for和select一同使用,有坑
    break只能跳出select,无法跳出for
    1. package test
    2. import (
    3. "fmt"
    4. "testing"
    5. "time"
    6. )
    7. func TestBreak(t *testing.T) {
    8. tick := time.Tick(time.Second)
    9. for {
    10. select {
    11. case t := <-tick:
    12. fmt.Println(t)
    13. break
    14. }
    15. }
    16. fmt.Println("end")
    17. }
    执行结果:
    1. === RUN TestBreak
    2. 2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
    3. 2019-12-19 14:43:42.0862832 +0800 CST m=+1.007127901
    4. 2019-12-19 14:43:42.7914242 +0800 CST m=+2.005754701
    5. 2019-12-19 14:43:43.0864832 +0800 CST m=+2.007254901
    6. ...

    break无法跳出select的解决方案

    1、标签
    1. func TestBreak(t *testing.T) {
    2. tick := time.Tick(time.Second)
    3. //FOR是标签
    4. FOR:
    5. for {
    6. select {
    7. case t := <-tick:
    8. fmt.Println(t)
    9. //break出FOR标签标识的代码
    10. break FOR
    11. }
    12. }
    13. fmt.Println("end")
    14. }
    2、goto
    1. func TestBreak(t *testing.T) {
    2. tick := time.Tick(time.Second)
    3. for {
    4. select {
    5. case t := <-tick:
    6. fmt.Println(t)
    7. //跳到指定位置
    8. goto END
    9. }
    10. }
    11. END:
    12. fmt.Println("end")
    13. }
    执行结果:
    1. === RUN TestBreak
    2. 2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
    3. end

    continue

    单独在select中是不能使用continue,会编译错误,只能用在for-select中。
    continue的语义就类似for中的语义,select后的代码不会被执行到。
    1. func TestBreak(t *testing.T) {
    2. tick := time.Tick(time.Second)
    3. for {
    4. select {
    5. case t := <-tick:
    6. fmt.Println(t)
    7. continue
    8. fmt.Println("test")
    9. }
    10. }
    11. fmt.Println("end")
    12. }
    执行结果
    1. === RUN TestBreak
    2. 2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
    3. 2019-12-19 14:43:42.0862832 +0800 CST m=+1.007127901
    4. 2019-12-19 14:43:42.7914242 +0800 CST m=+2.005754701
    5. 2019-12-19 14:43:43.0864832 +0800 CST m=+2.007254901
    6. ...

    return

    和函数中的return一样,跳出select,和for,后续代码都不执行