Hanya ada pernyataan untuk gelung dalam bahasa Pergi dan tiada gelung while atau do-while yang dimiliki oleh bahasa lain (seperti bahasa C, dll.).
for initialisation; condition; post { }
initialization Pernyataan permulaan hanya akan dilaksanakan sekali selepas inisialisasi selesai, ia akan menyemak sama ada keadaan itu benar. } akan dilaksanakan, dan kemudian Pernyataan jawatan akan dilaksanakan. Setiap kali penyataan gelung dalam {} berjaya diulang, penyataan siaran akan dilaksanakan, dan kemudian keadaan akan disemak semula untuk melihat sama ada ia benar. Jika benar, pelaksanaan pernyataan gelung akan diteruskan, jika tidak gelung akan ditamatkan.
Dalam Go, pemulaan, syarat dan pos semuanya adalah pilihan. Mari lihat contoh untuk lebih memahami gelung.
Kami menulis atur cara untuk mencetak semua integer dari 1-10 menggunakan gelung for.
package main import ( "fmt" ) func main() { for i := 1; i <= 10; i++ { fmt.Printf(" %d",i) } }
Laksanakan
Dalam kod di atas, i dimulakan kepada 1 dan pernyataan bersyarat akan menyemak i <= 10. Jika keadaan adalah benar, cetak nilai i, jika tidak, tamatkan gelung. Pernyataan pos menambah i sebanyak 1 pada akhir setiap lelaran, dan apabila i menjadi lebih besar daripada 10, gelung ditamatkan.
Kod di atas dicetak: 1 2 3 4 5 6 7 8 9 10
Pembolehubah yang diisytiharkan dalam gelung untuk hanya tersedia dalam skop badan gelung. Oleh itu, pembolehubah i tidak boleh diakses di luar badan gelung for.
break digunakan untuk menamatkan gelung for dan melompat keluar dari gelung untuk terus melaksanakan pernyataan selepas gelung for.
Kami mengubah suai kod sebelumnya dan menggunakan pernyataan putus untuk mencetak hanya semua integer antara 1-5.
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") }
Pelaksanaan
Dalam kod di atas, nilai i disemak setiap lelaran. Jika i lebih besar daripada 5, break dilaksanakan dan gelung ditamatkan, maka pernyataan cetakan selepas gelung for dilaksanakan.
上面的程序会输出:
1 2 3 4 5 line after for loop
continue 语句用于跳过 for 循环的当前迭代。本次迭代中,for 循环里面、continue 语句之后的代码都不会执行,继续进行下一次迭代。
让我们编写一个程序,使用 continue 打印从 1-10 的所有奇数。
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。如果为零,则该数为偶数,执行 continue 语句,则不会调用 continue 之后的 print 语句,并且循环继续进行下一次迭代。
上述程序的输出:1 3 5 7 9。
一个 for 循环内部有另一个 for 循环称为嵌套 for 循环。
我们通过编写一个打印以下序列的程序来理解嵌套的 for 循环。
* ** *** **** *****
下面的程序使用嵌套 for 循环打印上述序列。
第 8 行的变量 8 存储序列的行数,我们这里是 5。外部 for 循环将 i 从 0 迭代到 4,内部 for 循环将 j 从 0 迭代到 i 的当前值。内部循环为每次迭代打印 * ,外部循环在每次迭代结束时打印一个新行。
运行这个程序将会输出上面的有序序列。
package main import ( "fmt" ) func main() { n := 5 for i := 0; i < n; i++ { for j := 0; j <= i; j++ { fmt.Print("*") } fmt.Println() } }
执行
标签(label)可用于在内部 for 循环中断外部循环。让我们通过一个简单的例子来理解下:
package main import ( "fmt" ) func main() { for i := 0; i < 3; i++ { for j := 1; j < 4; j++ { fmt.Printf("i = %d , j = %d\n", i, j) } } }
执行
上面的程序比较容易理解,将会输出:
i = 0 , j = 1 i = 0 , j = 2 i = 0 , j = 3 i = 1 , j = 1 i = 1 , j = 2 i = 1 , j = 3 i = 2 , j = 1 i = 2 , j = 2 i = 2 , j = 3
上面的代码没什么特别的,我们继续往下看。
如果我们想实现当 i 和 j 相等时,停止打印该怎么办?我们需要做的是从内部循环破坏外部 for 循环。我们尝试在内部 for 循环判断当 i 和 j 相等时,执行 break 语句看能够实现中断外部 for 循环。
package main import ( "fmt" ) func main() { for i := 0; i < 3; i++ { for j := 1; j < 4; j++ { fmt.Printf("i = %d , j = %d\n", i, j) if i == j { break } } } }
执行
上面的代码,当判断 i 和 j 相等时,我们在内部 for 循环中会执行 break 语句,但这只会中断本次内部 for 循环,外部循环将继续执行。
程序输出:
i = 0 , j = 1 i = 0 , j = 2 i = 0 , j = 3 i = 1 , j = 1 i = 2 , j = 1 i = 2 , j = 2
这显然不是我们预期的输出。当 i 和 j 都相等时,即它们都等于 1 时,我们需要停止打印。
这时候标签(label)就可以派上用场了。标签可用于中断外部循环,让我们用 label 重写上面的程序。
package main import ( "fmt" ) func main() { outer: for i := 0; i < 3; i++ { for j := 1; j < 4; j++ { fmt.Printf("i = %d , j = %d\n", i, j) if i == j { break outer } } } }
执行
在上面的代码,我们在第 8 行循环的外部添加了名为 outer 的标签,在第 13 行通过指定跳转到该标签来终止外部循环,当 i 和 j 相等时,程序将停止打印。
执行代码输出:
i = 0 , j = 1 i = 0 , j = 2 i = 0 , j = 3 i = 1 , j = 1
我们通过更多的示例学习下 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 语句中 initialisation、condition 和 post 都是可选的。上面代码中,initialisation 和 post 都被忽略了,在循环外部,变量 i 已经初始化为 0。只要 i <= 10,就会执行循环,在 for 循环内部 i 每次都增加 2.
上述代码的 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,每次迭代结束时都递增 1。在 condition 条件中使用布尔运算符 && 来确保 i 小于或等于 10 并且 no 小于或等于 19。
无限循环的语法如下:
for { }
下面的代码将会循环不停地打印 Hello World。
package main import "fmt" func main() { for { fmt.Println("Hello World") } }
如果你在 go playground 中运行上面程序,将会报错:“process took too long”。在本地环境执行时将无限打印 Hello World。
Atas ialah kandungan terperinci Asas bahasa Go - penyataan gelung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!