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