02. 循环语句 (for / while)
在 Go 中, 循环只有一个关键字 for
, 通过不同的 格式 实现不同的逻辑
基本格式如下
for 默认值; 条件; 计数器 {
fmt.Println("i=", i)
}
以上的 每一个字段都可以省略 。
在 shell 中, 通常使用 seq
实现计数循环
for i in $(seq 1 10); do
{
echo "i = $i"
}
done
而在 Go 中,
for i := 0; i < 1; i++ {
fmt.Println("i=", i)
}
for name in zhangsan lisi wangwu zhaoliu; do
{
echo "name = $name"
}
done
在 Go 中, 需要将对象放入到 切片 中
func rangeSlice() {
names := []string{"zhangsan", "lisi", "wangwu", "zhaoliu"}
for idx, value := range names {
fmt.Println(names[idx], value)
}
}
其中, idx
为索引编号。
另外, 如果遍历对象是 map
func rangeMap() {
users := map[string]int{
"zhangsan": 20,
"lisi": 30,
"wangwu": 40,
}
for key, value := range users {
fmt.Println(key, value)
}
}
则第一个参数为 key
。 而非索引。
注意: value 在循环中, 都可以 省略, 只获取 idx 或 key。 取值的时候, 就使用 names[key]
这种方式。
在 shell 中, 使用 while 实现条件语句。 如果条件 恒真 则使用 True
或 :
实现。
while True; do
{
date
sleep 1
}
done
在 Go 中, 省去前后两段, 实现条件 a<=b
for ; a<=b ; {
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
}
// 死循环
for {
fmt.Println(time.Now())
time.Sleep(1 * time.Second)
}
如果条件 恒真 则为死循环, 省略所有条件语句即可。
跳出循环使用的两个关键字, 用法与 Shell 相同。
continue
: 结束当前循环语句, 进入下一次循环。break
: 退出所有循环, 不再执行剩下的循环次数。
for i := 1; i <= 10; i++ {
if i%2 == 0 {
// 当 i 是双数的时候, 退出当前循环
continue
}
if i > 6 {
// 当 i 大于 6 的时候, 结束所有循环
break
}
fmt.Println(i)
}
实际输出结果为 1, 3, 5
。
注意, i
实际是等于 7 的时候才结束整个循环的。