Kodewick
开始学 →
第 4 课,共 24 课目录

for 循环

第 4 课,共 24 课 · 第 1 部分 · 起步 · 约 15 分钟

同一件事要做很多次:把 1 到 100 加起来,数一数有几个符合条件的数,一年一年地算存款。这就是循环。别的语言有 while、do,Go 只有一个 for,不过它有好几种写法。

prog.go
1package main2 3import "fmt"4 5func main() {6	for i := 1; i <= 5; i++ {7		fmt.Println("第", i, "次")8	}9}
输出
第 1 次
第 2 次
第 3 次
第 4 次
第 5 次

for 后面是用分号隔开的三段:

部分什么时候做这里是
开始循环开始前做一次i := 1
条件每一轮开始前看一次,false 就结束i <= 5
每轮之后每一轮的循环体做完以后i++

i++ 就是 i = i + 1。点单步,看 i 怎么一轮一轮地变,最后变成 6 时条件不成立,循环结束。

累加和计数

循环最常见的用处:把很多数加起来。先准备一个从 0 开始的变量,每一轮往上加:

prog.go
1package main2 3import "fmt"4 5func main() {6	total := 07	for i := 1; i <= 100; i++ {8		total += i9	}10	fmt.Println("1 到 100 的和", total)11}
输出
1 到 100 的和 5050

total += i 是 total = total + i 的简写,-=、*= 也一样。数个数也是这个办法,只是符合条件时才加 1:

prog.go
1package main2 3import "fmt"4 5func main() {6	count := 07	for n := 1; n <= 50; n++ {8		if n%7 == 0 {9			count++10		}11	}12	fmt.Println("50 以内 7 的倍数有", count, "个")13}
输出
50 以内 7 的倍数有 7 个

n%7 == 0 是「n 除以 7 没有余数」,也就是 7 的倍数。

只写条件的 for

不知道要转几圈、只知道什么时候停的时候,只写条件就行。这就是别的语言里的 while:

prog.go
1package main2 3import "fmt"4 5func main() {6	price := 10007	years := 08	for price < 2000 {9		price = price * 120 / 10010		years++11	}12	fmt.Println(years, "年后涨到", price)13}
输出
4 年后涨到 2073

每年涨 20%,price 还没到 2000 就再转一圈。点单步,看 price 和 years 怎么一起变。

for range 数字

Go 1.22 起,for i := range 5 让 i 从 0 走到 4,一共 5 轮。只想重复几次、用不到 i 时,写 for range 3:

prog.go
1package main2 3import "fmt"4 5func main() {6	for i := range 3 {7		fmt.Println("第", i, "排")8	}9	for range 2 {10		fmt.Println("再来一次")11	}12}
输出
第 0 排
第 1 排
第 2 排
再来一次
再来一次
先猜一猜

这段程序显示什么?

1package main2 3import "fmt"4 5func main() {6	total := 07	for i := range 4 {8		total += i9	}10	fmt.Println(total)11}

break 和 continue

break 马上结束整个循环;continue 跳过这一轮剩下的部分,直接进入下一轮。找到想要的就停,用 break:

prog.go
1package main2 3import "fmt"4 5func main() {6	for n := 101; n <= 200; n++ {7		if n%13 == 0 {8			fmt.Println("100 以上第一个 13 的倍数", n)9			break10		}11	}12}
输出
100 以上第一个 13 的倍数 104

有些楼没有 4 层,电梯里的按钮跳过它,用 continue:

prog.go
1package main2 3import "fmt"4 5func main() {6	for floor := 1; floor <= 6; floor++ {7		if floor == 4 {8			continue9		}10		fmt.Println("楼层", floor)11	}12}
输出
楼层 1
楼层 2
楼层 3
楼层 5
楼层 6

什么都不写的 for

for 后面什么都不写,就是一直转下去的死循环。下面这段别运行,它永远停不下来:

1for {2	fmt.Println("停不下来")3}

它有用的时候,是和 break 一起:在循环体中间判断什么时候停。

prog.go
1package main2 3import "fmt"4 5func main() {6	money := 507	for {8		if money < 15 {9			break10		}11		money -= 1512		fmt.Println("买了一杯咖啡,还剩", money)13	}14	fmt.Println("钱不够了")15}
输出
买了一杯咖啡,还剩 35
买了一杯咖啡,还剩 20
买了一杯咖啡,还剩 5
钱不够了

嵌套循环

循环体里还可以再放一个循环。外面的循环每转一圈,里面的循环就从头到尾转一遍:

prog.go
1package main2 3import "fmt"4 5func main() {6	for row := 1; row <= 3; row++ {7		for col := 1; col <= 4; col++ {8			if col > 1 {9				fmt.Print(" ")10			}11			fmt.Print(row * col)12		}13		fmt.Println()14	}15}
输出
1 2 3 4
2 4 6 8
3 6 9 12

这是乘法表的前 3 行:第 row 行显示 row 乘 1 到 4。数和数之间要空格,但第一个前面不要,所以 col > 1 时才先显示一个空格。里面的循环结束后,fmt.Println() 换行。点单步,看 row 不变的时候 col 怎么从 1 走到 4。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

数一数 3 的倍数

数一数 1 到 n(包括 n)里有几个 3 的倍数。要显示 20 以内有 6 个 和 100 以内有 33 个。

要显示
20 以内有 6 个
100 以内有 33 个
exercise1.go
1package main2 3import "fmt"4 5func main() {6	n := 207	count := 08	fmt.Println(n, "以内有", count, "个")9	n = 10010	count = 011	fmt.Println(n, "以内有", count, "个")12}
输出
点「运行」或按 Ctrl+Enter
练习 2

存款到 2000 要几年

存款每年变成原来的 115%(money = money * 115 / 100)。算出从 start 开始,要几年才能到 2000 或更多。要显示 本金 1000 要 5 年 和 本金 1500 要 3 年。

要显示
本金 1000 要 5 年
本金 1500 要 3 年
exercise2.go
1package main2 3import "fmt"4 5func main() {6	start := 10007	money := start8	years := 09	fmt.Println("本金", start, "要", years, "年")10	start = 150011	money = start12	years = 013	fmt.Println("本金", start, "要", years, "年")14	_ = money // 先占个位,免得 money 没用到;写好循环就可以删掉15}
输出
点「运行」或按 Ctrl+Enter
练习 3

星号三角形

外面的循环已经写好了。在里面画一个高 n 的三角形:第 1 行 1 个 *,第 2 行 2 个,一直到第 n 行。

要显示
高 2
*
**
高 3
*
**
***
exercise3.go
1package main2 3import "fmt"4 5func main() {6	for n := 2; n <= 3; n++ {7		fmt.Println("高", n)8	}9}
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • Go 只有 for:三段式 for i := 1; i <= 5; i++,只写条件的 for x < 10(当 while 用),什么都不写的 for { … }(要配 break)。
  • for i := range 5 让 i 从 0 走到 4;for range 3 只重复 3 次。
  • 累加:从 0 开始,每轮 total += i;计数:符合条件时 count++。
  • break 结束整个循环,continue 跳到下一轮。
  • 嵌套循环:外面转一圈,里面转一整遍。
这一课学完了吗?点一下标记。进度存在这个浏览器里,随时可以撤销。