1. 程式人生 > 實用技巧 >【go語言學習】流程控制

【go語言學習】流程控制

流程控制是每種程式語言控制邏輯走向和執行次序的重要部分,流程控制可以說是一門語言的“經脈”。
程式的流程控制結構一共有三種:順序結構,選擇結構,迴圈結構。

  • 順序結構:從上向下,逐行執行。
  • 選擇結構:條件滿足,某些程式碼才會執行。0-1次
    分支語句:if,switch,select,goto
  • 迴圈結構:條件滿足,某些程式碼會被反覆的執行多次。0-N次
    迴圈語句:for

一、條件語句

1、if語句

語法格式

if 布林表示式 {
    執行程式碼塊
}
if 布林表示式 {
    執行程式碼塊
} else {
    執行程式碼塊
}
if 布林表示式 {
    執行程式碼塊
} else if 布林表示式 {
    執行程式碼塊
} else {
    執行程式碼塊
}

if語句的特殊寫法

if 執行語句;布林表示式 {
    執行程式碼塊
}
2、switch語句

switch是一個條件語句。

switch v {
    case v1:
        執行程式碼塊
    case v2:
        執行程式碼塊
    default:
        執行程式碼塊
}

switch 語句用於基於不同條件執行不同動作。
每一個 case 分支都是唯一的,從上到下逐一測試,直到匹配為止。
匹配成功後不會向下執行其他case分支,而是跳出整個switch。
go語言中每一個匹配項後面不需要再加break。
default語句可有可無,但是最多隻能有一個。
使用fallthrough

可以強制執行下面的一個case分支。

n := 10
switch n {
    case 10:
        fmt.Println(10)
        fallthrough
    case 20:
        fmt.Println(20)
    case 30:
        fmt.Println(30)
    default:
        fmt.Println("啥也不是")
}

執行結果

10
20

如果switch沒有表示式,它會匹配true。

score := 95
switch {
    case score >= 90:
        fmt.Println("優秀")
    case score >= 80 && score < 90:
        fmt.Println("優良")
    case score >= 70 && score < 80:
        fmt.Println("良好")
    case score >= 60 && score < 70:
        fmt.Println("及格")
    default:
        fmt.Println("不及格!")
}

執行結果

優秀

一個case後面可以新增多個條件,以逗號分開。

month := 8
switch month {
    case 1, 3, 5, 7, 8, 10, 12:
        fmt.Println("31天")
    case 4, 6, 9, 11:
        fmt.Println("30天")
    case 2:
        fmt.Println("我也不知道啊")
    default:
        fmt.Println("沒有的事兒~")
}

執行結果

31天

二、迴圈語句

1、for語句

所有的迴圈均可以通過for語句完成。

for 表示式1(迴圈變數初始化); 表示式2(判斷條件); 表示式3(更新迴圈變數) {
    迴圈體語句
}
for i := 0; i < 10; i++ {
    fmt.Printf("%v\t", i)
}

執行結果

0  1  2  3  4  5  6  7  8  9

for迴圈變體
for的表示式1、表示式2、表示式3三個均是可選的。
for迴圈的迴圈變數初始化可以被忽略,但是迴圈變數初始化語句後的分號必須要寫,例如:

i := 0
for ; i < 10; i++ {
    fmt.Printf("%v\t", i)
}

for迴圈的迴圈變數初始化語句和更新迴圈變數語句都可以省略,例如:

i := 0
for i < 10 {
    fmt.Printf("%v\t", i)
    i++
}

三個都省略,無限迴圈:

i := 0
for {
    fmt.Printf("%v\t", i)
    i++
    if i == 10 {
        break
    }
}

for range
Go語言中可以使用for range遍歷陣列、切片、字串、map 及通道(channel)。 通過for range遍歷的返回值有以下規律:

  • 陣列、切片、字串返回索引和值。
  • map返回鍵和值。
  • 通道(channel)只返回通道內的值。
s := "hello 世界"
for k, v := range s {
    fmt.Printf("%v-%v\n", k, v)
}

執行結果

0-h
1-e
2-l
3-l
4-o
5- 
6-世
9-界
2、break語句

break:跳出迴圈體。break語句用於在結束其正常執行之前突然終止for迴圈。

for i := 0; i < 10; i++ {
    fmt.Printf("%v\t", i)
    if i == 5 {
        break
    }
}

執行結果

0  1  2  3  4  5
3、continue語句

continue語句可以結束當前迴圈,開始下一次的迴圈迭代過程,僅限在for迴圈內使用。
在 continue語句後新增標籤時,表示開始標籤對應的迴圈。

label :
        for i := 0; i < 3; i++ {
                for j := 0; j < 5; j++ {
                        fmt.Printf("i = %v\tj = %v\n", i, j)
                        if j == 2 {
                                continue label
                        }
                }
        }

執行結果

i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2

三、goto語句

goto:可以無條件地轉移到過程中指定的行。

for i := 0; i < 5; i++ {
    fmt.Println(i)
    if i == 3 {
        goto breakTag
    }
}
breakTag: 
    fmt.Println("迴圈結束")

執行結果

0
1
2
3
迴圈結束

注意事項
break、goto、return、panic語句都可以強制退出迴圈。但需要注意:

  • break是結束當前迴圈
  • goto結束整個迴圈,轉移至指定行執行,只執行tag標籤後面的語句
  • return結束整個函式,其後的語句都不再執行
  • panic結束整個程式,其後的語句都不再執行
package main

import "fmt"

func main() {
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			fmt.Println(i, j)
			if j == 1 {
				break
			}
		}
	}
	fmt.Println("hello")
}

執行結果

0 0
0 1
1 0
1 1
hello
package main

import "fmt"

func main() {
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			fmt.Println(i, j)
			if j == 1 {
				goto breakTag
			}
		}
	}
	fmt.Println("hello")
breakTag:
	fmt.Println("迴圈結束")
}

執行結果

0 0
0 1
迴圈結束
package main

import "fmt"

func main() {
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			fmt.Println(i, j)
			if j == 1 {
				return
			}
		}
	}
	fmt.Println("hello")
}

執行結果

0 0
0 1
package main

import "fmt"

func main() {
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			fmt.Println(i, j)
			if j == 1 {
				panic("系統崩潰了")
			}
		}
	}
	fmt.Println("hello")
}

執行結果

0 0
0 1
panic: 系統崩潰了

goroutine 1 [running]:
main.main()
        E:/golang/go_project/main.go:10 +0x191
exit status 2