通过编写几个有用的示例来了解有关 Golang for 循环的所有信息。
最近,Rust、Golang 和 TypeScript 等编程语言在开发人员中变得非常流行。 如果你对后端开发和 DevOps 感兴趣,你应该考虑学习 Golang 是一个很好的选择!
如果您是学习编程语言基础知识的初学者,那么循环结构是您应该首先了解的概念之一。
Golang 仅提供 for 循环结构。 我们将了解 for 循环以及如何使用 for 循环模拟其他循环。
让我们开始!
Golang for 循环的语法
在 Golang 中,您可以使用以下语法创建 for 循环:
for initialization; condition; update { // do something }
这里,
- 初始化表示循环变量的初始化。
- condition 是决定循环体执行的循环条件。 只要循环条件的计算结果为真,循环体中的语句就会执行。 当条件变为假时,控件退出循环。
- update 表示对循环变量的更新——通常是递增或递减。
💡 请注意,这与 C 中没有括号的 for 循环有何相似之处。
这是 Golang 中 for 循环的控制流程:
是时候编写一些示例了!⏰ 要进行编码,您可以使用本地安装的 Golang 或在 Go Playground 上运行示例。
Golang For 循环示例
让我们使用刚刚学过的语法来编写我们的第一个 for 循环。 这是一个简单的 for 循环,它以 1 的步长打印出数字 1 到 5。
package main import "fmt" func main() { fmt.Println("For loop:") num := 5 for i := 1; i <= num; i++ { fmt.Println(i) } }
我们将循环变量 i 初始化为 1,将条件设置为 i <= 5,并在每次迭代后将循环变量递增 1。 这是输出:
//Output For loop: 1 2 3 4 5
让我们再写一个 for 循环。 这个循环从5开始,倒数到1; 它一直持续到循环变量大于或等于 1。因此我们在每次迭代后将循环变量递减 1。
package main import "fmt" func main() { fmt.Println("For loop:") num := 5 for i := num; i >= 1; i-- { fmt.Println(i) } }
我们得到了预期的输出:
//Output For loop: 5 4 3 2 1
循环变量的作用域是什么?
循环变量的范围仅限于 for 循环块,在循环外不可访问。
为了验证这一点,让我们尝试在循环外访问循环变量 i 的值:
package main import "fmt" func main() { fmt.Println("For loop:") num := 5 for i := 1; i <= num; i++ { fmt.Println(i) } fmt.Println(i) }
正如预期的那样,我们遇到了一个错误,指出 i 是一个未定义的(并且它的范围被限制在 for 循环中):
// Output ./prog.go:11:14: undefined: i
Golang 中的无限循环
我们可以在 Go 中使用无限循环吗? 是的,我们当然可以!
如果查看 for 循环的控制流程:
- 只要条件的计算结果为真,循环体就会继续执行。
- 当条件变为假时,控件退出循环。
- 因此,如果条件永远不会变为假(或始终为真),我们就会有一个无限循环。
但是您也可以在没有初始化、条件和更新的情况下使用 for 循环,而不会遇到语法错误。 因此,即使使用这样的 for 循环构造,您也可以使循环无限运行:
package main import "fmt" func main() { for { fmt.Println("running...") } }
//Output running... running... running... running... running... //and it goes on forever!
在这个例子中,我们将变量 num 设置为 5。循环条件是 num >= 5。因此只要 num 大于或等于 0,循环就会运行。
package main import "fmt" func main() { num := 5 for num > 0 { fmt.Println(num) } }
因为 num 的值永远不会改变,所以条件总是计算为真,并且循环永远运行!
//Output 5 5 5 5 5 5 //and it goes on forever!
所有的 Golang 都只有 for 循环结构,我们可以尝试使用 for 循环来模拟 while 和 do-while 循环。 那么让我们学习如何去做吧!
使用 For 循环模拟 While 循环
while 循环通常采用以下形式:
// initialize looping var while (condition){ // do something // update looping var }
如果你还记得,在我们写的第一个无限 for 循环中:我们使用了以下 for 循环——没有初始化、条件和更新。
for { // the simplest infinite loop }
所以我们可以修改 for 循环使其只包含条件(如下形式)来模拟 while 循环:
//initialize looping var for condition { // do something // update looping var }
这是我们编写的第一个 for 循环的等效 while 循环:
package main import "fmt" func main() { fmt.Println("Emulating while loop") num := 5 for num > 0 { fmt.Println(num) num-- } }
//Output Emulating while loop 5 4 3 2 1
使用 For 循环模拟 Do-While 循环
如果您使用过 C 等语言编写过代码,就会知道 do-while 循环结构采用以下形式:
// initialize looping var do { //something // update looping var } while(condition);
while 和 do while 循环之间的主要区别在于 while 循环在进入循环时检查条件。 另一方面,do-while 循环在退出循环时检查条件。
因此,在 while 循环中,如果条件的计算结果为假,则循环体永远不会执行。 但是,在 do-while 循环中,即使条件计算结果为假,循环体也会执行。
使用此信息,我们可以模拟 do-while 循环的行为:
- 写一个无限循环
- 使用具有正确条件的 if 条件语句来跳出循环
假设您想编写一个 do-while 循环,其中循环体执行的条件是 num < 0。因此您可以编写一个 for 循环并在 num >= 0 时跳出循环。
package main import "fmt" func main() { fmt.Println("Emulating do-while loop") num := 5 for { fmt.Println("loop runs...") if num >= 0 { break } } }
💡 注意,执行循环 if num < 0 和跳出循环 if num >= 0 是等价的条件。
尽管条件 num > 0 最初为假(num 为 5),但循环体运行一次,模拟 do-while 循环。
//Output Emulating do-while loop loop runs...
使用 For 循环遍历数组
在 Golang 中使用 for 循环和范围遍历数组时,您可以访问索引和元素。 这与 Python 中的枚举函数类似。
在这里,我们创建了 numArray,一个整数数组。 并使用 for 循环遍历它:
package main import "fmt" func main() { fmt.Println("Looping through an array") numArray := []int{3, 7, 0, 10, 8, 9} for idx, num := range numArray { fmt.Println("At index", idx, ": ", num) } }
如图所示,我们可以同时访问索引和每个索引处的元素:
//Output Looping through an array At index 0 : 3 At index 1 : 7 At index 2 : 0 At index 3 : 10 At index 4 : 8 At index 5 : 9
在 Golang For 循环中使用 defer
在 Golang 中,您可以使用 defer 关键字来延迟函数调用。
尽管用于资源清理和错误处理等应用程序,但了解如何在 for 循环中使用 defer 可能会有所帮助。 让我们看看当我们在 for 循环中使用 defer 来推迟对 Println() 函数的调用时会发生什么。
package main import "fmt" func main() { fmt.Println("For loop:") num := 5 for i := 1; i <= num; i++ { defer fmt.Println(i) } }
💬 当函数调用被延迟时,函数调用被压入堆栈并以 LIFO 顺序执行。 此执行仅在 defer 语句周围的函数返回后发生。
所以 fmt.Println(5) 首先执行,而 fmt.Println(1) 最后执行:
//Output For loop: 5 4 3 2 1
结论
以下是您在本教程中所学内容的总结:
- 在 Golang 中,您可以使用以下语法创建 for 循环:for initialization; 健康)状况; 更新 { //循环体}。
- for 循环的控制流程非常简单。 循环变量初始化一次,查找条件决定是否执行循环体,更新指的是每次迭代后循环变量的更新。
- 循环变量的范围仅限于循环体,在循环外不可访问。
- 虽然 Golang 仅提供 for 循环结构,但您可以使用 for 循环模拟 while 和 do-while 循环行为。
- for 循环的一些其他应用包括遍历数组和延迟 for 循环体内的函数调用。
接下来,学习如何在 Python 中使用 for 循环。 快乐学习!🎉