[Go] 基礎系列一: for-select中的break、continue和return


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,后續代碼都不執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM