Go語言之流程控制

2020-08-11 23:49:04

在Go語言中,總結後的流程控制語句主要有ifforswitchgoto。其中常用的爲iffor
接下來講依次記錄這幾種流程控制,並以程式碼進行說明。

if流程控制

if條件語句的一般格式如範例所示:

/*
當第一個表達式爲true時,執行第一個邏輯塊,否則判斷第二個表達式;第二個表達式爲true時執行第二個邏輯塊,
否則執行第三個邏輯塊。
*/
if 表達式 {
	邏輯塊
} else if 表達式 {
	邏輯塊
} else {
	邏輯塊
}

注意:在Go中關於if有個硬性規定,與if匹配的{必須和if與表達式在同一行,{放在其他位置在編譯的時候會報錯;與else匹配的{也必須寫在同一行,並且else與它對應的if}也要在同一行。
範例:

func ifDemo() {
	age  := 25
	if age >= 65 {
		fmt.Println("美滋滋地退休生活...")
	} else if age <= 18 {
		fmt.Println("美滋滋的地學生生活...")
	} else {
		fmt.Println("苦逼的上班社畜0.0")
	}
}

此外,if語句還可以在表達式之前寫一個執行語句,用隔開,之後再根據條件進行判斷真假
範例:

func ifDemo() {	
	if age  := 25; age >= 65 {
		fmt.Println("美滋滋地退休生活...")
	} else if age <= 18 {
		fmt.Println("美滋滋的地學生生活...")
	} else {
		fmt.Println("苦逼的上班社畜0.0")
	}
}

這種在if後面定義的變數,其作用域爲整個if流程,出了if流程之後age變數便失去了作用。

for控制流程

在Go中的控制回圈實現用for

for回圈的基本格式

如下範例:

for 初始語句;條件語句;結束語句 {
	回圈塊語句
}

條件語句返回true時回圈會一直進行下去,回圈塊會一直執行,直到條件語句返回false時退出回圈

變種1:在Go中for回圈的初始語句可以忽略
範例:

func forDemo() {
	i := 0
	for ; i < 9; ++i {
		fmt.Printf("%d ",i)
	}
}

變種2:在Go中for回圈的初始語句結束語句都可以忽略
範例:

func forDemo() {
	i := 0
	for ; i < 9; {
		fmt.Printf("%d ",i)
		i++
	}
}

死回圈:可以通過breakgotoreturnpanic強制退出回圈來結束死回圈

for 的鍵值回圈

在Go中可以通過使用for range來遍歷陣列、切片、字串、map等。其中,在遍歷陣列、切片和字串的時候,其遍歷返回索引和值;在遍歷map時返回鍵、值;在遍歷channel時只返回通道值。

switch case控制流程

通過使用switch+case來對大量的if語句進行簡化程式碼,範例:

func switchDemo() {
	age := 25
	switch {	//case使用表達式的時候在switch後不寫變數
	case age < 12:
		fmt.Println("童年")
	case age < 18:
		fmt.Println("少年")
	case age < 30:
		fmt.Println("青年")
	case age < 60:
		fmt.Println("中年")
	default:	//default在一個switch中只能有一個
		fmt.Println("老年")
	}
}

注意:在Go中,匹配到case後執行對應的語句塊後會直接跳出switch語句,不必寫break來跳出switch流程。
變種1case後可跟數位、字母,且switchcase的數據型別必須相同
範例:

func switchDemo() {
	age := 2
	switch age {	//age與1、2、3、4都是相同的數據型別
	case 1:
		fmt.Println(1)
	case 2:
		fmt.Println(2)
	case 3:
		fmt.Println(3)
	case 4:
		fmt.Println(4)
	default:	
		fmt.Println(5)
	}
}

變種2 :通過使用fallthrough來執行滿足case條件的下一個case,範例:

func switchDemo() {
	age := 25
	switch {
	case age < 12:
		fmt.Println("童年")
	case age < 18:
		fmt.Println("少年")
	case age < 30:
		fmt.Println("青年")
		fallthrough
	case age < 60:
		fmt.Println("中年")
	default:
		fmt.Println("老年")
	}
}

會列印出"青年"跟"中年"兩個字串

goto控制流程

goto語句通過標籤在程式碼間的進行無條件跳轉。比較有效的用於多層回圈退出時,範例:

//雙回圈不使用goto時需要設定一個退出標籤來跳出回圈,多層時需要更多的標籤
func gotoDemo1() {
	var breakFlag bool
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 設定退出標籤
				breakFlag = true
				break
			}
			fmt.Printf("%v-%v\n", i, j)
		}
		// 外層for回圈判斷
		if breakFlag {
			break
		}
	}
}

//使用goto直接跳出雙回圈
func gotoDemo2() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 設定退出標籤
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 標籤
breakTag:
	fmt.Println("結束for回圈")
}

break控制流程

break語句可以結束forswitchselect的程式碼塊。範例:

//break語句還可以在語句後面新增標籤,表示退出某個標籤對應的程式碼塊
func breakDeme() {
//要求標籤必須在對應的語句的程式碼塊上
breakDemo:
	for i:= 0; i < 10; i++ {
		if i == 8 {
			break breakDeme
		}
		fmt.Println(i)
	}
	fmt.Println("Demo is over...")
}

continue控制流程

continue語句可以結束當前回圈,開始下一次的回圈迭代過程,僅限在for回圈內使用

func breakDeme() {
//在 continue語句後新增標籤時,表示開始標籤對應的回圈。
continueDemo:
	for i:= 0; i < 10; i++ {
		if i == 8 {
			continue continueDemo
		}
		fmt.Println(i)
	}
	fmt.Println("Demo is over...")
}