[08 Go語言基礎-for迴圈]
迴圈
迴圈語句是用來重複執行某一段程式碼。
for
是 Go 語言唯一的迴圈語句。Go 語言中並沒有其他語言比如 C 語言中的 while
和 do while
迴圈。
for 迴圈語法
for initialisation; condition; post {
}
初始化語句只執行一次。迴圈初始化後,將檢查迴圈條件。如果條件的計算結果為 true
,則 {}
內的迴圈體將執行,接著執行 post 語句。post 語句將在每次成功迴圈迭代後執行。在執行 post 語句後,條件將被再次檢查。如果為 true
, 則迴圈將繼續執行,否則 for 迴圈將終止。(譯註:這是典型的 for 迴圈三個表示式,第一個為初始化表示式或賦值語句;第二個為迴圈條件判定表示式;第三個為迴圈變數修正表示式,即此處的 post )
這三個組成部分,即初始化,條件和 post 都是可選的。讓我們看一個例子來更好地理解迴圈。
例子
讓我們用 for
迴圈寫一個打印出從 1 到 10 的程式。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
fmt.Printf(" %d",i)
}
}
在上面的程式中,i 變數被初始化為 1。條件語句會檢查 i 是否小於 10。如果條件成立,i 就會被打印出來,否則迴圈就會終止。迴圈語句會在每一次迴圈完成後自增 1。一旦 i 變得比 10 要大,迴圈中止。
上面的程式會打印出 1 2 3 4 5 6 7 8 9 10
。
在 for
迴圈中宣告的變數只能在迴圈體內訪問,因此 i 不能夠在迴圈體外訪問。
break
break
語句用於在完成正常執行之前突然終止 for 迴圈,之後程式將會在 for 迴圈下一行程式碼開始執行。
讓我們寫一個從 1 列印到 5 並且使用 break
跳出迴圈的程式。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i > 5 {
break //loop is terminated if i > 5
}
fmt.Printf("%d ", i)
}
fmt.Printf("\nline after for loop")
}
在上面的程式中,在迴圈過程中 i 的值會被判斷。如果 i 的值大於 5 然後 break
語句就會執行,迴圈就會被終止。列印語句會在 for
迴圈結束後執行,上面程式會輸出為
1 2 3 4 5
line after for loop
continue
continue
語句用來跳出 for
迴圈中當前迴圈。在 continue
語句後的所有的 for
迴圈語句都不會在本次迴圈中執行。迴圈體會在一下次迴圈中繼續執行。
讓我們寫一個打印出 1 到 10 並且使用 continue
的程式。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue
}
fmt.Printf("%d ", i)
}
}
在上面的程式中,這行程式碼 if i%2==0
會判斷 i 除以 2 的餘數是不是 0,如果是 0,這個數字就是偶數然後執行 continue
語句,從而控制程式進入下一個迴圈。因此在 continue
後面的列印語句不會被呼叫而程式會進入一下個迴圈。上面程式會輸出 1 3 5 7 9
。
更多例子
讓我們寫更多的程式碼來演示 for
迴圈的多樣性吧
下面這個程式打印出從 0 到 10 所有的偶數。
package main
import (
"fmt"
)
func main() {
i := 0
for ;i <= 10; { // initialisation and post are omitted
fmt.Printf("%d ", i)
i += 2
}
}
正如我們已經知道的那樣,for
迴圈的三部分,初始化語句、條件語句、post 語句都是可選的。在上面的程式中,初始化語句和 post 語句都被省略了。i 在 for
迴圈外被初始化成了 0。只要 i<=10
迴圈就會被執行。在迴圈中,i 以 2 的增量自增。上面的程式會輸出 0 2 4 6 8 10
。
上面程式中 for
迴圈中的分號也可以省略。這個格式的 for
迴圈可以看作是二選一的 for while
迴圈。上面的程式可以被重寫成:
package main
import (
"fmt"
)
func main() {
i := 0
for i <= 10 { //semicolons are ommitted and only condition is present
fmt.Printf("%d ", i)
i += 2
}
}
在 for
迴圈中可以宣告和操作多個變數。讓我們寫一個使用宣告多個變數來列印下面序列的程式。
’‘’
10 * 1 = 10
11 * 2 = 22
12 * 3 = 36
13 * 4 = 52
14 * 5 = 70
15 * 6 = 90
16 * 7 = 112
17 * 8 = 136
18 * 9 = 162
19 * 10 = 190
package main
import (
"fmt"
)
func main() {
for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 { //multiple initialisation and increment
fmt.Printf("%d * %d = %d\n", no, i, no*i)
}
}
‘’‘
在上面的程式中 no
和 i
被宣告然後分別被初始化為 10 和 1 。在每一次迴圈結束後 no
和 i
都自增 1 。布林型操作符 &&
被用來確保 i 小於等於 10 並且 no
小於等於 19 。
無限迴圈
無限迴圈的語法是:
for {
}
下一個程式就會一直列印Hello World
不會停止。
package main
import "fmt"
func main() {
for {
fmt.Println("Hello World")
}
}
在你本地系統上執行,來無限的列印 “Hello World” 。
這裡還有一個 range
結構,它可以被用來在 for
迴圈中運算元組物件。當我們學習陣列時我們會補充這方面內容。
迴圈(小案例)
package main
import "fmt"
// for
/*
for關鍵字 變數初始化;條件;自增,自減{
迴圈體的內容
}
*/
func main() {
// 使用方式一
//for i:=0;i<10;i++{
// fmt.Println(i)
//}
//使用方式二:省略掉第一部分,i的作用域範圍大一些
//i:=0
//for ;i<10;i++{
// fmt.Println(i)
//}
//fmt.Println(i)
//使用方式三:省略掉第三部分;第一部分和第三部分都省略
//for i:=0;i<10;{
// fmt.Println(i)
// i++
//}
//第四種方式: for 條件{},等同於while
//i:=0
//for i<10{
// fmt.Println(i)
// i++
//}
//for true {
// fmt.Println("sdfasdf")
//}
// 使用方式五:死迴圈 三部分都省略
//for {
// fmt.Println("sdfasdf")
//}
// continue 和break
for i:=0;i<10;i++{
if i==5{
//continue
break
}
fmt.Println(i)
}
}