Golang 中的 For 循环

GolangGolangBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

与其他编程语言不同,Go 语言中只有 "for" 一个关键字用于循环语句。然而,它非常高效且灵活。让我们来学习 Go 中的 for 循环。

知识点:

  • For 循环
  • For range 循环

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("`Golang`")) -.-> go/BasicsGroup(["`Basics`"]) go(("`Golang`")) -.-> go/DataTypesandStructuresGroup(["`Data Types and Structures`"]) go(("`Golang`")) -.-> go/FunctionsandControlFlowGroup(["`Functions and Control Flow`"]) go/BasicsGroup -.-> go/variables("`Variables`") go/DataTypesandStructuresGroup -.-> go/strings("`Strings`") go/DataTypesandStructuresGroup -.-> go/arrays("`Arrays`") go/FunctionsandControlFlowGroup -.-> go/for("`For`") go/FunctionsandControlFlowGroup -.-> go/if_else("`If Else`") go/FunctionsandControlFlowGroup -.-> go/range("`Range`") subgraph Lab Skills go/variables -.-> lab-149073{{"`Golang 中的 For 循环`"}} go/strings -.-> lab-149073{{"`Golang 中的 For 循环`"}} go/arrays -.-> lab-149073{{"`Golang 中的 For 循环`"}} go/for -.-> lab-149073{{"`Golang 中的 For 循环`"}} go/if_else -.-> lab-149073{{"`Golang 中的 For 循环`"}} go/range -.-> lab-149073{{"`Golang 中的 For 循环`"}} end

字符串中的字符

在之前关于基本数据结构的部分中,我们了解到字符串是字符的集合。因此,我们可以使用索引来获取字符串中的特定字符。让我们创建一个 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 {
    // 代码块
}

初始化语句用于初始化一个变量。条件应返回一个布尔值。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 循环的语法,让我们用 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 关键字可用于跳过当前迭代并开始下一次迭代。

您可能感兴趣的其他 Golang 教程