介绍
与其他编程语言不同,Go 语言中仅提供了 for 这一种循环语句关键字。然而,它非常高效且灵活。让我们一起来学习 Go 中的 for 循环。
知识点:
- For 循环
- For range 循环
与其他编程语言不同,Go 语言中仅提供了 for 这一种循环语句关键字。然而,它非常高效且灵活。让我们一起来学习 Go 中的 for 循环。
知识点:
在之前关于基础数据结构的章节中,我们了解到字符串是字符的集合。因此,我们可以使用索引(index)来获取字符串中的特定字符。让我们创建一个 string.go 文件并写入以下代码:
cd ~/project
touch string.go
package main
import "fmt"
func main() {
s := "labex"
// 使用索引访问字符串中的每个字符
fmt.Println(s[0], s[1], s[2], s[3], s[4])
// 打印字符
fmt.Printf("%c %c %c %c %c\n", s[0], s[1], s[2], s[3], s[4])
}
运行程序:
go run string.go
输出结果如下:
108 97 98 101 120
l a b e x
在这个程序中,我们声明了一个字符串变量来存储「labex」,并使用索引访问字符串中的每个字符。在打印时,我们发现程序输出的是数字而不是实际的字符。
通过对比下方的 ASCII 表,我们可以看到这些数字对应着实际的字符。例如,在 ASCII 表中,「108」对应字符「l」。
这是因为字符在底层实际上是按照「UTF-8」编码存储每个字符的数值。由于「UTF-8」兼容「ASCII」,所以字符「l」的位置实际上存储的是数值编码「108」。
如果我们想输出字符,可以使用 fmt.Printf 函数配合 %c 转义序列。这在代码的第二行中得到了演示,它会将数值编码转换为字符后再进行输出。
为了访问 string.go 文件中字符串的每个字符,我们每次都需要声明一个索引。当处理成百上千个数据时,这会变得非常麻烦。在这种情况下,我们可以使用 for 循环来进行操作。
循环会根据条件执行程序。让我们来看看 for 循环语句的语法:
for initialization; condition; post {
// 代码块
}
**初始化语句(initialization)**用于初始化一个变量。**条件语句(condition)**应当返回一个布尔值。**后置语句(post)**在每次循环迭代后修改变量的值。让我们看一个具体的例子。
在 ~/project 目录下创建一个 for.go 文件,并写入以下内容:
cd ~/project
touch for.go
package main
import "fmt"
func main() {
// 输出从 0 到 9 的数字
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
运行程序:
go run for.go
输出结果如下:
0
1
2
3
4
5
6
7
8
9
在这个程序中,我们首先将临时变量 i 初始化为 0,在每次循环迭代中,i 的值都会增加 1。循环的条件是只要 i 的值小于 10 就会继续执行,这意味着程序将输出从 0 到 9 的数字。
注意: 在 for 循环中,初始化、条件和后置语句都是可选的。这意味着即使没有这些语句,for 循环也能正常工作。
如果只存在条件语句,for 循环的功能就类似于其他语言中的「while」循环。
以下代码仅使用条件语句实现了与前一个程序相同的结果:
package main
import "fmt"
func main() {
i := 0
for i < 10 {
fmt.Println(i)
i++
}
}
你可以看到,当只有条件语句存在时,用于分隔语句的分号 ; 可以省略。
现在我们已经理解了 for 循环的语法,让我们使用 for 循环重写第一个程序 string.go。
package main
import "fmt"
func main() {
s := "labex"
for i := 0; i < len(s); i++ {
fmt.Printf("%d %c\n", int(s[i]), s[i])
}
}
运行程序:
go run string.go
输出结果如下:
108 l
97 a
98 b
101 e
120 x
让我们做一个挑战来巩固对 for 循环的理解。
创建一个 for2.go 文件。任务是按倒序输出字符串「labex」中的每个字符。
预期输出:
x
e
b
a
l
要求:
for2.go 文件应放置在 ~/project 目录下。提示:索引是从 0 开始的。
在上一节中,我们提到 for 循环中的三个语句都是可选的。如果一个都不声明会发生什么?让我们实验一下。
将以下代码写入 for.go 文件:
package main
import "fmt"
func main() {
for {
fmt.Printf("1")
}
}
运行程序:
go run for.go
我们可以看到,如果在 for 循环中没有声明条件,条件将被默认为 true,循环将无限持续下去。
提示: 使用 Ctrl+C 可以终止程序。
如果我们想在不声明条件语句或无法编写条件语句的情况下,在特定条件下退出循环,可以使用「break」关键字。它会强制立即退出当前所在的循环。
使用以下代码更新 for.go 文件,该代码使用「break」关键字输出 23 个「1」:
package main
import "fmt"
func main() {
i := 0
for {
// 在每次循环迭代中将 i 的值增加 1
i++
fmt.Printf("1")
// 当 i 的值为 23 时退出循环
if i == 23 {
break
}
}
}
「break」关键字不仅可以用于没有条件语句的 for 循环,也可以用于带有条件语句的 for 循环。当满足「break」条件时,它会跳过条件语句并退出循环。
除了强制立即退出循环的「break」关键字外,还有一个「continue」关键字,它允许你跳过当前循环迭代的剩余部分,并开始下一次迭代。
「continue」关键字的用法与「break」关键字类似,但它们的功能不同。
让我们更新 for.go 文件来跳过数字 2 和 8:
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
if i == 2 || i == 8 {
continue
}
fmt.Println(i)
}
}
运行程序:
go run for.go
输出结果如下:
0
1
3
4
5
6
7
9
在这个程序中,我们在 for 循环的代码块中添加了一个条件语句。如果当前循环变量的值为 2 或 8,它将跳过剩余的代码并开始下一次循环迭代。因此,输出结果中不包含数字 2 和 8。
在本实验中,我们学习了 for 循环。让我们回顾一下:
for 循环中的所有三个参数都是可选的。break 关键字可用于退出当前循环。continue 关键字可用于跳过当前迭代并开始下一次迭代。