六 Go语言之流程控制

之前我们写的程序都是从第一行开始执行,一直执行到末尾,一行一行的顺序执行下来,这种执行结构叫顺序执行结构。

GO语言除了有顺序结构,还有选择结构,循环结构。
顺序结构:程序按顺序执行,不发生跳转。
选择结构:依据是否满足条件,有选择的执行相应功能。
循环结构:依据条件是否满足,循环多次执行某段代码。

下面先讲解选择结构

一 选择结构

1.1 if结构

在编程中实现选择判断结构就是用if

if 条件判断{
    
    
代码语句
}

条件判断如果为真(true),那么就执行大括号中的语句。如果为假(false),就不执行大括号中的语句,(大家可以想一下,什么样的表达式返回的结果要么为true,要么为false),而是继续执行if结构后面的代码

具体案例如下:

func main() {
    
    
	var age int = 19
	var b bool
	b = age > 18
	//注意:这里和java不一样,if后没有括号
	if b {
    
    
		fmt.Println("成年人")
	}
}

GO语言相比其它语言要灵活很多,下面我们看一下if的另外一种语法格式

func main() {
    
    
	//if支持1个初始化语句,初始化语句和判断条件以封号分割
	if a := 10; a == 10{
    
    
		fmt.Println("a==10")
	}
}

1.2 if else结构

语法如下

if 条件判断{
    
    
	代码语句1
}else{
    
    
	 代码语句2
}

首先先执行if后面的条件判断,如果条件判断成立(结果为真),执行if后面的代码语句1,代码语句1执行完成后,表示整个if—else–结构结束了(else后面的代码语句2不会执行),继续执行后面的代码。如果if后面的条件判断不成立也就是结果为假,那么if后面的代码语句1不会被执行,这时会执行else后面的代码语句2,执行完后,表示整个if—else—结构执行结束了,再执行后续的代码。

下面我们通过if—else做一个案例

func main() {
    
    
	var score float64
	fmt.Println("请输入成绩")
	fmt.Scanf("%f",&score)
	if score>60{
    
    
		fmt.Println("及格了")
	}else {
    
    
		fmt.Println("没及格")
	}
}

结果
在这里插入图片描述

1.3 if嵌套

我们上面的案例中,使用的是if-else的基本结构,其实if-else结构还可以进行嵌套使用。

func main() {
    
    
	var score float64
	fmt.Println("请输入成绩")
	fmt.Scanf("%f", &score)
	if score > 60 {
    
    
		fmt.Println("及格了")
		if score < 90 {
    
    
			fmt.Println("优秀")
		} else {
    
    
			fmt.Println("特优秀")
		}

	} else {
    
    
		fmt.Println("没及格")
		if score < 30 {
    
    
			fmt.Println("特差")
		} else {
    
    
			fmt.Println("一般差")
		}
	}
}

结果
在这里插入图片描述

1.4 if-else if 结构

语法如下:

if 条件判断{
    
    
	要执行的代码段
}else if 条件判断{
    
    
	要执行的代码段
}else if 条件判断{
    
    
	要执行的代码段
}else if条件判断{
    
    
	要执行的代码段
}…………………………….else{
    
    
}

通过以上的语法格式我们发现,可以写很多的else if结构。

具体的执行过程:程序首先判断第一个if所带的小括号中的判断条件,如果条件成立,也就是返回一个true,则执行该if所带的大括号中的代码,执行完成后,立即跳出if else-if结构。

如果第一个if所带的判断条件不成立,也就是返回一个false,则继续向下进行判断,依次的判断每一个if所带的判断条件,如果成立,就执行该if所带的大括号中的代码,如果不成立,则继续向下判断,如果每个if所带的判断条件都不成立,就看当前这个if else-if结构中是否存在else。

如果有else的话,则执行else中所带的代码,如果没有else,则整个 if-else if什么都不做。
else可以省略。

小结
if结构适合:一种的判断
if-else结构适合:两种情况的判断
if-else if 结构适合: 多种情况判断,并且判断都是对区间中的数据进行判断(例如:考试成绩)

1.5 switch结构

在这里插入图片描述
通过上面的代码,我们实际上是定义了一个bool类型的变量,默认值为true,当输入评定级别错误时,将其改为false.最后在输出工资时,做了判断,如果条件成立表示输入了正确的评定级别,所以输出对应的工资,否则不输出工资。(这种技巧,需要大家好好体会一下)

我们前面在讲解if-else if结构时讲过,该结构适合什么场合:1.多条件判断,2:区间性的数据判断。但是我们看一下该案例,是否是对区间性的数据进行判断呢?不是,而是定值判断,也就是对一个固定值的判断。

对这种固定值的判断推进使用switch-case结构。

1.5.1 switch-case结构语法如下

switch 变量或者表达式的值{
    
    
	case1:
		要执行的代码
	case2:
		要执行的代码
	case3:
		要执行的代码
	………………………………..
	default:
		要执行的代码
}

switch-case结构的执行流程

程序执行到switch处,首先将变量或者表达式的值计算出来,然后拿着这个值依次跟每个case后面所带的值进行匹配,一旦匹配成功,则执行该case所带的代码,执行完成后,跳出switch-case结构。如果,跟每个case所带的值都不匹配,就看当前这个switch-case结构中是否存在default,如果有default,则执行default中的语句,如果没有default,则该switch-case结构什么都不做。

基本案例演示如下:

func main() {
    
    
	var score int =30
	switch score {
    
    
	case 90:
		fmt.Println("优秀")
	case 80:
		fmt.Println("良好")
	case 70:
		fmt.Println("一般")	
	case 60:
		fmt.Println("及格")	
	default:
		fmt.Println("不及格")
	}
}

GO语言中switch-case结构中,case后面默认自带break(终止程序执行),这是与其它语言不同的地方。

另外一种语法格式如下

func main() {
    
    
	switch score := 70; score {
    
    
	case 90:
		fmt.Println("优秀")
	case 80:
		fmt.Println("良好")
	case 70:
		fmt.Println("一般")
	case 60:
		fmt.Println("及格")
	default:
		fmt.Println("不及格")
	}
}

注意:某个case 后面跟着的代码执行完毕后,不会再执行后面的case,而是跳出整个switch结构, 相当于每个case后面都跟着break(终止); 但是如果我们想执行完成某个case后,强制执行后面的case,可以使用fallthrough。

func main() {
    
    

    switch {
    
    
    case false:
            fmt.Println("The integer was <= 4")
            fallthrough
    case true:
            fmt.Println("The integer was <= 5")
            fallthrough
    case false:
            fmt.Println("The integer was <= 6")
            fallthrough
    case true:
            fmt.Println("The integer was <= 7")
    case false:
            fmt.Println("The integer was <= 8")
            fallthrough
    default:
            fmt.Println("default case")
    }
}

1.6 if-else if与switch的比较

相同点:
都可以实现多分支结构

不同点(根据个人习惯进行选择):
if-else if:可以处理范围
switch:一般用于等值比较

switch结构和if-else结构是可以结合来使用的,可以根据具体的问题具体分析,灵活来应用。

二 循环结构

2.1 基本语法结构

在GO语言中,我们有专门实现这种循环的结构就是for结构(GO语言中只有for循环结构,没有while,do-while结构)

for 表达式1;表达式2;表达式3{
    
    
	循环体
}

表达式1:定义一个循环的变量,记录循环的次数
表达式2:一般为循环条件,循环多少次
表达式3:一般为改变循环条件的代码,使循环条件终有一天不再成立
循环体:重复要做的事情。

下面我们用for循环结构输出10遍“Hello GO”。

func main() {
    
    
	var i int
	for i=1;i<10;i++{
    
    
		fmt.Println("Hello Go")
	}
}

2.2 跳转语句

关于GO语句中的跳转语句,有break,continue,goto(与函数结合使用,后期讲解到函数在讲)
下面我们先来讲解break.

根据前面的案例,我们发现,循环必须指定循环条件,在满足循环条件的时候执行循环,如果不满足循环的条件,可以跳出整个循环。但是,如果我们没有指定循环条件,那么循环就成了死循环,所谓的死循环指的就是一直循环,跳不出来了。
怎样构建死循环呢?语法如下:

func main() {
    
    
	for {
    
    
		fmt.Println("Hello Go")
	}
}

死循环(无限循环)的语法非常简单,就是什么循环条件也没有写。
下面我们来看一下,关于死循环的应用场景

2.2.1 break

要求用户输入用户名和密码,只要不是admin、888888就一直提示用户名,密码错误,请重新输入。

注意:我们要在用户输入正确的用户名和密码的时候跳出整个循环,那么我们应该怎样强制的跳出死循环呢?我们可以使用break关键字。

break的作用就是跳出本次循环
案例演示如下:

func main() {
    
    
	var userName string
	var userPwd string
	for {
    
    
		fmt.Println("请输入用户名:")
		fmt.Scanf("%s\n", &userName)
		fmt.Scanf("%s\n", &userPwd)
		//判断用户名密码是否正确
		if userName == "admin" && userPwd == "888888" {
    
    
			fmt.Println("登录成功!")
			break
		} else {
    
    
			fmt.Println("用户名密码错误,请重新输入!!")
		}
	}
}

结果
在这里插入图片描述
通过以上案例演示,我们发现当程序执行到break语句时,会跳出for循环。

思考:现在将上面的题目的需求再改动一下,加上以下条件”用户名密码输入错误,最多输错3次,超过3次,提示输入错误信息次数太多,并且结束整个程序”,那么该程序怎样修改呢?

案例演示如下:

func main() {
    
    
	var userName string
	var userPwd string
	//记录错误次数
	var count int  
	for {
    
    
		fmt.Println("请输入用户名:")
		fmt.Scanf("%s\n", &userName)
		fmt.Scanf("%s\n", &userPwd)
		//判断用户名密码是否正确
		if userName == "admin" && userPwd == "888888" {
    
    
			fmt.Println("登录成功!")
			break
		} else {
    
    
			count++
			if count>=-3{
    
    
				fmt.Println("错误次数太多!!")
				break
			}
			fmt.Println("用户名密码错误,请重新输入!!")
		}
	}
}

2.2.2 continue

前面我们已经讲解完成了break,下面我们来说一下continue语句。
continue的作用是:立即结束本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环.
基本语法:

func main() {
    
    
	for i:=1;i<=5;i++{
    
    
		if i==2{
    
    
			continue
		}
		fmt.Println("i的值:",i)
	}
}

Guess you like

Origin blog.csdn.net/qq_33417321/article/details/115014778