Golang For 循环教程 [With Examples]

通过编写几个有用的示例来了解有关 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 循环块,在循环外不可访问。

  如何修复错误 UPnP 在 Xbox 上不成功

为了验证这一点,让我们尝试在循环外访问循环变量 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 循环在退出循环时检查条件。

  2022 年要知道的一切

因此,在 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 关键字来延迟函数调用。

  如何修复错误 UPnP 在 Xbox 上不成功

尽管用于资源清理和错误处理等应用程序,但了解如何在 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 循环。 快乐学习!🎉