介绍
与其他编程语言不同,Go 语言中只有 "for" 一个关键字用于循环语句。然而,它非常高效且灵活。让我们来学习 Go 中的 for 循环。
知识点:
- For 循环
- For range 循环
与其他编程语言不同,Go 语言中只有 "for" 一个关键字用于循环语句。然而,它非常高效且灵活。让我们来学习 Go 中的 for 循环。
知识点:
在之前关于基本数据结构的部分中,我们了解到字符串是字符的集合。因此,我们可以使用索引来获取字符串中的特定字符。让我们创建一个 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 {
// 代码块
}
初始化语句用于初始化一个变量。条件应返回一个布尔值。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
循环中,初始化、条件和 post 语句都是可选的。这意味着即使没有这些语句,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
关键字可用于跳过当前迭代并开始下一次迭代。