for 循环
同一件事要做很多次:把 1 到 100 加起来,数一数有几个符合条件的数,一年一年地算存款。这就是循环。别的语言有 while、do,Go 只有一个 for,不过它有好几种写法。
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 开始的变量,每一轮往上加:
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:
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:
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:
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}
range 4 让 i 依次是 0、1、2、3,不包括 4。0 + 1 + 2 + 3 = 6。
break 和 continue
break 马上结束整个循环;continue 跳过这一轮剩下的部分,直接进入下一轮。找到想要的就停,用 break:
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:
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 一起:在循环体中间判断什么时候停。
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 钱不够了
嵌套循环
循环体里还可以再放一个循环。外面的循环每转一圈,里面的循环就从头到尾转一遍:
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。
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。
数一数 3 的倍数
✓数一数 1 到 n(包括 n)里有几个 3 的倍数。要显示 20 以内有 6 个 和 100 以内有 33 个。
20 以内有 6 个 100 以内有 33 个
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}
存款到 2000 要几年
✓存款每年变成原来的 115%(money = money * 115 / 100)。算出从 start 开始,要几年才能到 2000 或更多。要显示 本金 1000 要 5 年 和 本金 1500 要 3 年。
本金 1000 要 5 年 本金 1500 要 3 年
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}
星号三角形
✓外面的循环已经写好了。在里面画一个高 n 的三角形:第 1 行 1 个 *,第 2 行 2 个,一直到第 n 行。
高 2 * ** 高 3 * ** ***
1package main2 3import "fmt"4 5func main() {6 for n := 2; n <= 3; n++ {7 fmt.Println("高", n)8 }9}
这一课学会了
- 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跳到下一轮。- 嵌套循环:外面转一圈,里面转一整遍。