1. 程式人生 > >6、控制結構

6、控制結構

1、條件語句

1.1if—else結構

if a>1{
	//do something
}
//存在else分支
if a>1{
	//do something
}else{
	//do something
}
//分支可以有很多個
if a>1{
	//do something
}else if a>0{//前段程式碼塊的右大括號 }必須和 else-if 關鍵字在同一行
	//do something
}else{
	//do something
}

注意事項:if—else條件語句中宣告的變數只在條件語句中存在,如果和成員變數有相同的名字,則成員變數被隱藏。

1.2switch結構

switch i{
	case -1,0: //當代碼塊只有一行時,可以直接放置在 case 語句之後。
		//do something不需要使用花括號將多行語句括起來
	case 1:
		//do something
	case 2:fallthrough//如果在執行完每個分支的程式碼後,還希望繼續執行後續分支的程式碼,可以使用 fallthrough 關鍵字來達到目的
		//do something
	...
	default: //可選
		//do something
}
//switch 語句還可以被用於 type-switch 來判斷某個 interface 變數中實際儲存的變數型別。
switch x.
(type){ case type: //do something case type: //do something }

1.3select結構
select是Go中的一個控制結構,類似於用於通訊的switch語句。每個case必須是一個通訊操作,要麼是傳送要麼是接收。select隨機執行一個可執行的case。如果沒有case可執行,它將阻塞,直到有case可執行。一個預設的子句應該總是可執行的。
涉及通訊channel,暫時跳過。

2、迴圈語句

如果想要重複執行某些語句,Go 語言中您只有 for 結構可以使用。
基本形式為:for 初始化語句; 條件語句; 修飾語句 {}

2.1for迴圈

//基於計數器的迭代
for i := 0;i<5;i++{
	//do something
}
//可以在迴圈中同時使用多個計數器
for i, j := 0, N; i < j; i, j = i+1, j-1 {}
//迴圈巢狀
for i:=0; i<5; i++ {
	for j:=0; j<10; j++ {
	//do something
	}
}
//基於條件判斷的迭代,沒有初始化語句和修飾語句的 for 結構
for i>0{
	//do something
	i--
}
//無限迴圈
//如 i:=0; ; i++ 或 for { } 或 for ;; { } ( ;; 會在使用 gofmt 時被移除)或for true { } 或for { } 。
//

2.2for-range結構
它可以迭代任何一個集合(包括陣列和 map)
一般形式:for ix, val := range collection { }
要注意的是, val 始終為集合中對應索引的值拷貝,因此它一般只具有隻讀性質,對它所做的任何修改都不會影響到集合中原有的值(如果 val 為指標,則會產生指標的拷貝,依舊可以修改集合中的原值)。

2.3break、continue、goto
一個 break 的作用範圍為該語句出現後的最內部的結構。但在 switch 或 select 語句中,break 語句的作用結果是跳過整個程式碼塊,執行後續的程式碼。關鍵字 continue 忽略剩餘的迴圈體而直接進入下一次迴圈的過程

func main() {
for i := 0; i < 10; i++ {
	if i == 5 {
	continue//break
	}
	fmt.Print(i)
	}
}

for、switch 或 select 語句都可以配合標籤(label)形式的識別符號使用。可以使用 goto 語句和標籤配合使用來模擬迴圈(在發生讀取錯誤時,使用 goto 來跳出無限讀取迴圈並關閉相應的客戶端連結)。

func main() {
MYLABEL:
for i := 0; i < 10; i++ {
	if i == 5 {
	continue MYLABEL//跳轉到 LABEL1 標籤的位置
	}
	fmt.Print(i)
	}
}
func main() {
	i:=0
	HERE:
	print(i)
	i++
	if i==5 {
	return
	}
	goto HERE
}