《Shell 转 Go》
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

02. 循环语句 (for / while)

Go 循环

在 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 对象

另外, 如果遍历对象是 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] 这种方式。

While 循环

在 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 相同。

  1. continue: 结束当前循环语句, 进入下一次循环。
  2. 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 的时候才结束整个循环的。