break
- select中的break,類似c系列中的break,break后的語句不執行
- for和select一同使用,有坑
break只能跳出select,無法跳出for
package test
import (
"fmt"
"testing"
"time"
)
func TestBreak(t *testing.T) {
tick := time.Tick(time.Second)
for {
select {
case t := <-tick:
fmt.Println(t)
break
}
}
fmt.Println("end")
}
執行結果:
=== RUN TestBreak
2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
2019-12-19 14:43:42.0862832 +0800 CST m=+1.007127901
2019-12-19 14:43:42.7914242 +0800 CST m=+2.005754701
2019-12-19 14:43:43.0864832 +0800 CST m=+2.007254901
...
break無法跳出select的解決方案
1、標簽
func TestBreak(t *testing.T) {
tick := time.Tick(time.Second)
//FOR是標簽
FOR:
for {
select {
case t := <-tick:
fmt.Println(t)
//break出FOR標簽標識的代碼
break FOR
}
}
fmt.Println("end")
}
2、goto
func TestBreak(t *testing.T) {
tick := time.Tick(time.Second)
for {
select {
case t := <-tick:
fmt.Println(t)
//跳到指定位置
goto END
}
}
END:
fmt.Println("end")
}
執行結果:
=== RUN TestBreak
2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
end
continue
單獨在select中是不能使用continue,會編譯錯誤,只能用在for-select中。
continue的語義就類似for中的語義,select后的代碼不會被執行到。
func TestBreak(t *testing.T) {
tick := time.Tick(time.Second)
for {
select {
case t := <-tick:
fmt.Println(t)
continue
fmt.Println("test")
}
}
fmt.Println("end")
}
執行結果
=== RUN TestBreak
2019-12-19 14:43:41.7912242 +0800 CST m=+1.005627701
2019-12-19 14:43:42.0862832 +0800 CST m=+1.007127901
2019-12-19 14:43:42.7914242 +0800 CST m=+2.005754701
2019-12-19 14:43:43.0864832 +0800 CST m=+2.007254901
...
return
和函數中的return一樣,跳出select,和for,后續代碼都不執行