循环语句

时间:2024-10-25 07:32:36

在Go语言中,for 循环是实现循环的主要方式,它非常灵活且强大。

1. 基本的 for 循环

这种形式类似于 C/C++ 和 Java 中的 for 循环。它包括三个部分:初始化语句;条件表达式;后续操作(通常是递增或递减)。

for 初始化; 条件; 后续操作 {
    // 循环体代码
}

示例代码

	for num := 0; num < 20; num++ {
		fmt.Println(num)
	}

	// 后续操作可以放到for循环里面
	for num := 0; num < 20; {
		fmt.Println(num)
		num++
	}

2. 类似 while 的 for 循环

在Go中,你可以省略初始化和后续操作部分,只保留条件表达式,使其行为类似于传统意义上的 while 循环。

for 条件 {
    // 循环体代码
}

示例代码

	num := 0

	for num < 20 {
		fmt.Println(num)
		num++
	}

3. 无限循环

如果你省略了所有三个部分(初始化、条件、后续操作),那么循环将变成一个无限循环。

for {
    // 永远执行直到内部有break或return等跳出逻辑。
}

示例代码

package main

import (
	"fmt"
	"time"
)

func main() {
	num := 0

	for {
		fmt.Println(num)
		num++
		//	睡眠1秒
		time.Sleep(time.Second * 1)
	}
}

4. range循环

Go 还提供了一种特殊形式的 for 来迭代集合类型(如数组、切片和映射map)。使用关键字 range, 它会返回两个值:索引和元素值。

	nums := []int{10, 20, 30, 40, 50}

	for index, value := range nums {
		fmt.Printf("下标: %d ,下标对应值: %d\n", index, value)
	}

	//	在 range 循环中,如果不需要索引,可以使用 _ 来忽略它:
	for _, value := range nums {
		fmt.Printf("下标对应值: %d\n", value)
	}

5. 控制语句:break 和 continue

基本用法

  • break: 跳出整个循块。
  • continue: 跳过当前迭代,并开始下一次迭代。

每种类型的 for 循块都可以使用这些控制语句来改变其执行流程。

	for i := 0; i < 20; i++ {
		fmt.Println(i)
		// 到5的时候跳出循环
		if i == 5 {
			break
		}
	}

	for i := 0; i < 20; i++ {
		// 到5的时候跳过,继续下次循环
		if i == 5 {
			continue
		}
		fmt.Println(i)
	}

配合标签使用

在Go语言中,continuebreak 可以与标签(label)配合使用来控制嵌套循环的流程。这种用法可以让你直接跳出多层循环或者继续执行外层循环的下一次迭代,而不仅仅是最内层的那个。

标签是紧跟着冒号的一个标识符(例如 Label:),它可以放在任何语句之前,但通常用于循环语句前。

使用 break 与标签

当你使用带有标签的 break 时,你可以结束指定标签所指向的循环,而不仅是当前最内部的那个for循环。

package main

import "fmt"

func main() {
OuterLoop:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			if i > j {
				fmt.Printf("已满足条件i>j,跳出整个循环 i = %d, j = %d\n", i, j)
				break OuterLoop
			}
			fmt.Printf("i = %d, j = %d\n", i, j)
		}
	}
}

输出:

i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
已满足条件i>j,跳出整个循环 i = 1, j = 0
使用 continue 与标签

当你使用带有标签的 continue时,程序会跳过当前迭代,并开始执行带有该标签的外层循环下一次迭代。

package main

import "fmt"

func main() {
OuterLoop:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			if i == j {
				fmt.Printf("已满足条件i==j,继续下个循环 i = %d, j = %d\n", i, j)
				continue OuterLoop // 跳到OuterLoop开始新一轮迭代
			}
			fmt.Printf("i = %d, j = %d\n", i, j)
		}
	}
}

输出:

已满足条件i==j,继续下个循环 i = 0, j = 0
i = 1, j = 0
已满足条件i==j,继续下个循环 i = 1, j = 1
i = 2, j = 0
i = 2, j = 1
已满足条件i==j,继续下个循环 i = 2, j = 2

练习

前面 05 go语言(golang) - 常量和条件语句 文章中的练习题,现在可以优化为:

用户输入一个数字,看是否与程序随机生成的一样

package main

import (
	"fmt"
	"math/rand"
)

func main() {

	fmt.Println("猜猜看,请输入我想1-100数字:")
	var targetNumber int = rand.Intn(100) + 1 // 随机生成1-100的数字,左闭右开,不加一的话是0到99
	//println(targetNumber)

	count := 0

	for {
		if number := inputNumber(); number > targetNumber {
			fmt.Printf("比 %d 小,再猜猜\n", number)
			count++
		} else if number < targetNumber {
			fmt.Printf("比 %d 大,再猜猜\n", number)
			count++
		} else {
			fmt.Printf("恭喜!猜对了!一共猜了 %d 次\n", count)
			break
		}
	}

}

func inputNumber() int {
	var number int
	_, err := fmt.Scanf("%d", &number)
	if err != nil {
		fmt.Println("输入有误请重新输入!")
		return inputNumber()
	}
	return number
}