流程控制是每種編程語言走向和執(zhí)行次序的重要部分
golang中最常用的流程控制有if和for,而switch和goto主要是為了簡化代碼、降低重復代碼而生的結(jié)構(gòu),屬于擴展類的流程控制。
if else(分支結(jié)構(gòu))
if 條件判斷基本寫法
if 表達式1 {
分支1
} else if 表達式2 {
分支2
} else{
分支3
}
if條件判斷的特殊寫法
if條件判斷可以在if表達式之前添加一個執(zhí)行語句,再根據(jù)變量值進行判斷:
func main() {
if score := 65; score > 90 {
fmt.Println("A")
} else if score > 75 {
fmt.Println("B")
} else {
fmt.Println("C")
}
}
for(循環(huán)結(jié)構(gòu))
golang中的所有循環(huán)類型均可以使用for關(guān)鍵字來完成
for循環(huán)基本格式:
for 初始語句;條件表達式;結(jié)束語句{
循環(huán)體語句
}
例子:
func forDemo() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
可以省略初始語句,單分號一定要寫:
func forDemo2() {
i := 0
for ; i < 10; i++ {
fmt.Println(i)
}
}
也可以省略初始語句和結(jié)束語句:
func forDemo3() {
i := 0
for i < 10 {
fmt.Println(i)
i++
}
}
這種寫法類似于其他編程語言中的while,在while后添加一個條件表達式,滿足條件表達式時持續(xù)循環(huán),否則結(jié)束循環(huán)。
無限循環(huán)
for {
循環(huán)體語句
}
for循環(huán)可以通過break、goto、return、panic語句強制退出循環(huán)。
for range(簡直循環(huán))
Go語言中可以使用for range遍歷數(shù)組、切片、字符串、map 及通道(channel)。 通過for range遍歷的返回值有以下規(guī)律:
- 數(shù)組、切片、字符串返回索引和值。
- map返回鍵和值。
- 通道(channel)只返回通道內(nèi)的值。
switch case
使用switch語句可以方便對大量值進行判斷
func switchDemo1() {
finger := 3
switch finger {
case 1:
fmt.Println("大拇指")
case 2:
fmt.Println("食指")
case 3:
fmt.Println("中指")
case 4:
fmt.Println("無名指")
case 5:
fmt.Println("小拇指")
default:
fmt.Println("無效的輸入!")
}
}
Go語言規(guī)定每個switch只能有一個default分支。
一個分支可以有多個值,多個case值中間使用逗號分割:
func testSwitch3() {
switch n := 7; n {
case 1, 3, 5, 7, 9:
fmt.Println("奇數(shù)")
case 2, 4, 6, 8:
fmt.Println("偶數(shù)")
default:
fmt.Println(n)
}
}
分支還可以使用表達式:
func switchDemo4() {
age := 30
switch {
case age < 25:
fmt.Println("好好學習吧")
case age > 25 && age < 35:
fmt.Println("好好工作吧")
case age > 60:
fmt.Println("好好享受吧")
default:
fmt.Println("活著真好")
}
}
fallthrough語法可以執(zhí)行滿足條件的case的下一個case,是為了兼容C語言中的case設(shè)計的。
func switchDemo5() {
s := "a"
switch {
case s == "a":
fmt.Println("a")
fallthrough
case s == "b":
fmt.Println("b")
case s == "c":
fmt.Println("c")
default:
fmt.Println("...")
}
}
輸出:
a
b
goto(跳轉(zhuǎn)到指定標簽)
goto語句通過標簽進行代碼間無條件跳轉(zhuǎn)。goto語句可以快速跳出循環(huán)、避免重復退出。
使用goto語句能簡化代碼實現(xiàn)過程,例如雙層嵌套的for循環(huán)要退出時。
例子:
func gotoDemo1() {
var breakFlag bool
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 設(shè)置退出標簽
breakFlag = true
break
}
fmt.Printf("%v-%v\n", i, j)
}
// 外層for循環(huán)判斷
if breakFlag {
break
}
}
}
使用goto語句能簡化代碼:
func gotoDemo2() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 設(shè)置退出標簽
goto breakTag
}
fmt.Printf("%v-%v\n", i, j)
}
}
return
// 標簽
breakTag:
fmt.Println("結(jié)束for循環(huán)")
}
break(大跳)
break語句可以結(jié)束for、switch和select的代碼塊。
break語句還可以在語句后面添加標簽,表示退出某個標簽對應的代碼塊,標簽要求必須定義在對應的for、switch和 select的代碼塊上。 舉個例子:
func breakDemo1() {
BREAKDEMO1:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
break BREAKDEMO1
}
fmt.Printf("%v-%v\n", i, j)
}
}
fmt.Println("...")
}
continue(小跳)
continue語句可以結(jié)束當前循環(huán),開始下一次的循環(huán)迭代過程,僅限在for循環(huán)內(nèi)使用。
在 continue語句后添加標簽時,表示開始標簽對應的循環(huán)。例如:
func continueDemo() {
forloop1:
for i := 0; i < 5; i++ {
// forloop2:
for j := 0; j < 5; j++ {
if i == 2 && j == 2 {
continue forloop1
}
fmt.Printf("%v-%v\n", i, j)
}
}
}