Go 语言中的 For 循环

GolangBeginner
立即练习

介绍

与其他编程语言不同,Go 语言中仅提供了 for 这一种循环语句关键字。然而,它非常高效且灵活。让我们一起来学习 Go 中的 for 循环。

知识点:

  • For 循环
  • For range 循环
这是一个引导实验,提供了逐步的指导来帮助你学习和练习。请仔细遵循说明完成每个步骤,并获得动手实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 97%。它获得了学习者 95% 的好评率。

字符串中的字符

在之前关于基础数据结构的章节中,我们了解到字符串是字符的集合。因此,我们可以使用索引(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 循环语句的语法:

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 循环的语法,让我们使用 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 目录下。
  • 使用 for 循环来实现该结果。

提示:索引是从 0 开始的。

✨ 查看解决方案并练习

break 关键字

在上一节中,我们提到 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」条件时,它会跳过条件语句并退出循环。

continue 关键字

除了强制立即退出循环的「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 关键字可用于跳过当前迭代并开始下一次迭代。