4.流程控制

4.流程控制

4.1 if-else 语句

    条件判断是由if语句实现,根据条件的结果truefalse来执行相应的代码。其基本语法格式如下所示:

  • 基本 if 语句
if  condition-1 {
    // do something
} else if condition-2 {
	// do something
} else {
	// do something
}
  • 嵌套 if 语句
if  condition-1 {
	// do something
	if condition-1-1 {
		// do something
	} else if condition-1-2 {
		// do something
	} else {
		// do something
	}
} else if condition-2 {
	// do something
} else {
	// do something
}

    在使用 if 语句的注意事项如下所示:

  • 每个条件语句后面必须紧跟 {}
  • 在 if 语句中,仅有一个ifelse关键字,但允许拥有多个else if,语句出现的顺序为if -> else if -> else
  • 一个简单的 if 语句,可以允许仅有一个 if 关键字
  • 不推荐在 if 语句进行多层嵌套处理,这样会导致逻辑难以理解和代码冗余

    示例代码如下所示:

package main

import "fmt"

func main() {
	var score int
	fmt.Print("请输入分数:")
	fmt.Scan(&score)
	if score >= 90 {
		fmt.Printf("分数为%d,成绩非常棒", score)
	} else if score >= 80 {
		fmt.Printf("分数为%d,成绩良好", score)
	} else if score >= 70 {
		fmt.Printf("分数为%d,成绩中等", score)
	} else if score >= 60 {
		fmt.Printf("分数为%d,成绩合格", score)
	} else if score < 60 {
		fmt.Printf("分数为%d,成绩不合格", score)
	}
}

    在以上代码定义的scoremain方法中属于全局变量,Go 语言中也支持在 if 语句中定义临时变量,作用域仅限于 if 语句内使用,示例代码如下所示:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	if num := rand.Intn(100); num < 50 {
		fmt.Printf("随机数%d < 50 成立", num)
	} else if num > 20 {
		fmt.Printf("随机数%d > 20 成立", num)
	}
	// 这里获取随机数%d会出现报错,超出作用域,报错信息: undefined: num
	// fmt.Printf("这里获取随机数%d会出现报错,超出作用域", num)
}

4.2 switch 语句

    多条件语句是由switch语句实现的,可以某个变量值进行条件选择并执行相应的代码,其基本语法格式如下所示:

  • 第一种方式
switch 变量{
	case 值-1:
	  执行语句-1
	  fallthrough
	case 值-2:
	  执行语句-2
	default:
	  执行语句-n
}
  • 第二种方式
switch  {
	case 变量的条件判断-1:
	   执行语句-1
	case 变量的条件判断-2:
	   执行语句-2
	   fallthrough
	default:
	   执行语句-n
}
  • 第三种方式
switch 定义变量;变量{
	case 值-1:
	  执行语句-1
	  fallthrough
	case 值-2:
	  执行语句-2
	default:
	  执行语句-n
}

    在使用 switch 语句时,注意事项如下所示:

  • 关键字 switch 后面可根据需要决定是否设置变量,且末端需要添加{}
  • 一个 switch 语句中可以包含多个关键字 case,但只有一个关键字 default
  • 关键字 case 是设置变量的判断条件,若符合条件,则执行对应的语句,执行完毕后直接跳出整个switch语句,不再往下执行
  • 程序在执行 switch 语句时,case 语句是从上往下按顺序执行
  • 当程序执行了某个 case 语句之后,若还想继续执行下一个case语句,可以使用关键字fallthrough 继续执行后续的 case

    示例代码如下所示:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	// 第一种方式
	randomNum := rand.Intn(40)
	switch randomNum {
	case 10:
		fmt.Printf("随机数为10,成立\n")
		fallthrough
	case 20:
		fmt.Printf("随机数为20,成立\n")
	case 50:
		fmt.Printf("随机数为50,成立\n")
	default:
		fmt.Printf("以上条件均不成立,生成的随机数为:%d\n", randomNum)
	}

	// 第二种方式
	switch {
	case randomNum < 10:
		fmt.Printf("随机数为:%d < 10,成立\n", randomNum)
	case randomNum < 20:
		fmt.Printf("随机数为:%d < 20,成立\n", randomNum)
	case randomNum < 50:
		fmt.Printf("随机数为:%d < 50,成立\n", randomNum)
		fallthrough
	default:
		fmt.Printf("以上条件均不成立,生成的随机数为:%d\n", randomNum)
	}

	// 第三种方式
	switch randomNum2 := rand.Intn(10); randomNum2 {
	case 1, 3, 5, 7, 9:
		fmt.Printf("生成的随机数为奇数,值为:%d\n", randomNum2)
		fallthrough
	case 0, 2, 4, 6, 8:
		fmt.Printf("生成的随机数为偶数,值为:%d\n", randomNum2)
	default:
		fmt.Printf("不知道是哪一类数字\n")
	}
}

    运行结果如下所示:

以上条件均不成立,生成的随机数为:27
随机数为:27 < 50,成立
以上条件均不成立,生成的随机数为:27
生成的随机数为奇数,值为:5
生成的随机数为偶数,值为:5

4.3 for 语句

4.3.1 基本 for 语句

    Go 语言的循环语句仅支持for语句,不支持while和do-while语法。for 循环可对可迭代变量进行遍历输出。可迭代变量一般是指字符串数组切片通道等类型的数据。其基本语法如下所示:

for 变量初始值;判断条件;变量控制 {
	循环体语句
}

    for 关键字后参数说明:

  • 变量初始值:一般为赋值表达式,定义变量或给变量设置初始值
  • 判断条件:一般为关系表达式或逻辑表达式,用于控制循环是否继续循环,为 true 则继续循环
  • 变量控制:一般为赋值表达式,对变量进行递增或递减等

    在实际使用,以上三个参数都是可选项,可根据实际需要灵活变换,常见的组合方式如下所示:

// 基本型
for 变量初始值;判断条件;变量控制 {
	循环体语句
}

for 变量初始值;判断条件; {
	循环体语句
}

for 判断条件 {
	循环体语句
}

for  {
	循环体语句
}

在使用 for 的各种组合,需要注意避免死循环

    示例代码如下所示:

package main

import "fmt"

func main() {
	// 基本型
	for i := 0; i < 5; i++ {
		fmt.Printf(" %d", i)

	}
	fmt.Println()

	// 组合方式二
	for i := 0; i < 5; {
		fmt.Printf(" %d", i)
		i++
	}
	fmt.Println()
	// 组合方式三
	i := 0
	for i < 5 {
		fmt.Printf(" %d", i)
		i++
	}
	fmt.Println()

	// 组合方式四
	j := 0
	for {
		if j > 5 {
			break
		}
		fmt.Printf(" %d", j)
		j++
	}
}

    运行结果如下所示:

 0 1 2 3 4
 0 1 2 3 4
 0 1 2 3 4
 0 1 2 3 4 5

4.3.2 for-range 语句

    for 语句是通过设置循环变量来执行循环次数,如果要对可迭代变量的元素遍历输出,也可以使用for-range语句。其基本语法如下所示:

for index, value := range v {
	循环语句
}
  • index:代表当前可迭代对象的索引
  • value: 代表当前可迭代对象的值

    示例代码如下所示:

package main

import "fmt"

func main() {
	// 定义一个数组
	nameArray := [...]string{"Surpass", "Surmount", "Jack", "Herry"}
	for index, value := range nameArray {
		fmt.Printf("数组输出->当前索引为:%d,元素值为:%s\n", index, value)
	}
	fmt.Println()

	// 定义一个切片
	nameSlice := []string{"Surpass", "Surmount", "Jack", "Herry"}
	for index, value := range nameSlice {
		fmt.Printf("切片输出->当前索引为:%d,元素值为:%s\n", index, value)
	}
	fmt.Println()
	// 忽略索引
	ageSlice := []int{18, 28, 38, 88}
	for _, value := range ageSlice {
		fmt.Printf("切片输出忽略索引->元素值为:%d\n", value)
	}
	fmt.Println()

	// 仅获取索引
	for index := range ageSlice {
		fmt.Printf("切片输出仅获取索引->元素索引为:%d\n", index)
	}
	fmt.Println()
}

    运行结果如下所示:

数组输出->当前索引为:0,元素值为:Surpass
数组输出->当前索引为:1,元素值为:Surmount
数组输出->当前索引为:2,元素值为:Jack
数组输出->当前索引为:3,元素值为:Herry

切片输出->当前索引为:0,元素值为:Surpass
切片输出->当前索引为:1,元素值为:Surmount
切片输出->当前索引为:2,元素值为:Jack
切片输出->当前索引为:3,元素值为:Herry

切片输出忽略索引->元素值为:18
切片输出忽略索引->元素值为:28
切片输出忽略索引->元素值为:38
切片输出忽略索引->元素值为:88

切片输出仅获取索引->元素索引为:0
切片输出仅获取索引->元素索引为:1
切片输出仅获取索引->元素索引为:2
切片输出仅获取索引->元素索引为:3

4.4 中断语句

4.4.1 break 语句

    当程序执行 switch 语句、select 语句、for 语句时,需要在特定条件下结束当前操作时,可以使用break实现结束当前操作。如果出现多层嵌套,还可以结束指定位置的循环。示例代码如下所示:

package main

import "fmt"

func main() {
	// 基本使用,结束本次循环
	for i := 0; i < 5; i++ {
		fmt.Printf("当前值为:%d\n", i)
		if i == 2 {
			fmt.Println("遇见break,结束本次循环")
			break
		}
	}
	fmt.Println("~~~~~~~~~~~~~~")
	// 未指定位置
	for i := 0; i < 5; i++ {
		for j := i; j < 5; j++ {
			fmt.Printf("当前i值为:%d,j值为:%d\n", i, j)
			if j == 2 {
				fmt.Println("遇见break,结束本次循环")
				break
			}
		}
	}
	fmt.Println("~~~~~~~~~~~~~~")
	// 多层嵌套,结束指定循环
loop1:
	for i := 0; i < 5; i++ {
		for j := i; j < 5; j++ {
			fmt.Printf("当前i值为:%d,j值为:%d\n", i, j)
			if j == 2 {
				fmt.Println("遇见break,结束本次循环")
				// 这里添加loop1,可以直接结束最外层循环
				break loop1
			}
		}
	}
}

    运行结果如下所示:

当前值为:0
当前值为:1
当前值为:2
遇见break,结束本次循环
~~~~~~~~~~~~~~
当前i值为:0,j值为:0
当前i值为:0,j值为:1
当前i值为:0,j值为:2
遇见break,结束本次循环
当前i值为:1,j值为:1
当前i值为:1,j值为:2
遇见break,结束本次循环
当前i值为:2,j值为:2
遇见break,结束本次循环
当前i值为:3,j值为:3
当前i值为:3,j值为:4
当前i值为:4,j值为:4
~~~~~~~~~~~~~~
当前i值为:0,j值为:0
当前i值为:0,j值为:1
当前i值为:0,j值为:2
遇见break,结束本次循环

在其他语言中,break 不支持越级结束循环,但在 Go 语言里面可以越级结束循环,只需要在特定循环前添加标签,在 break 语句后添加对应的标签即可

4.4.2 continue 语句

    continue 语句只适用于 for 语句,其可以实现跳过本次循环进入下一次循环,示例代码如下所示:

package main

import "fmt"

func main() {
	for i := 0; i < 5; i++ {
		if i == 3 {
			continue
		}
		fmt.Printf("当前值为:%d\n", i)
	}
}

    运行结果如下所示:

当前值为:0
当前值为:1
当前值为:2
当前值为:4

可以看出在 i=3 时,跳过本次循环,继续下一次循环输出

4.5 跳转语句

    关键字goto语句可以通过标签在代码之间的无条件跳转,不仅可以快速跳出循环,也能简化重复性代码,其基本语法如下所示:

for 变量初始值;判断条件;变量控制 {
	goto 标签名
}

标签名:
   执行语句

    关键字 goto 后面必须标签名,程序查找对应标签执行标签后面的代码。定义的标签名及代码必须在 goto 关键字后面,否则会出现死循环。以下为陷入死循环的代码,需要尽量避免。为避免 goto 引起的死循环问题,定义的标签及代码一般建议放置在程序的末端位置。以下代码会导致出现死循环,需要避免。

package main

import "fmt"

func main() {
	loopA:
		fmt.Println("跳转至goto语句")
	for i := 0; i < 5; i++ {
		if i == 3 {
			goto loopA
		}
		fmt.Printf("当前值为:%d\n", i)
	}
}

    推荐的 goto 跳转示例代码如下所示:

package main

import "fmt"

func main() {
	for i := 0; i < 5; i++ {
		if i == 3 {
			goto loopA
		}
		fmt.Printf("当前值为:%d\n", i)
	}
	// 为避免goto导致死循环,标签放置在代码末端
loopA:
	fmt.Println("跳转至goto语句")
	fmt.Println("程序结束")
}

    运行结果如下所示:

当前值为:0
当前值为:1
当前值为:2
跳转至goto语句
程序结束

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

posted @ 2025-07-13 21:17  Surpassme  阅读(66)  评论(0)    收藏  举报