go---流程控制---循环


一、if 循环?

1.1 、if 单循环

语法
在这里插入图片描述



1.1.2、双分支控制

在这里插入图片描述

1.1.3、多分支控制 if … else if …else

在这里插入图片描述

1、多分支的判断流程如下:
(1) 先判断条件表达式 1 是否成立,如果为真,就执行代码块 1
(2) 如果条件表达式 1 如果为假,就去判断条件表达式 2 是否成立, 如果条件表达式 2 为真,
就执行代码块 2
(3) 依次类推.
(4) 如果所有的条件表达式不成立,则执行 else 的语句块。
2else 不是必须的。
3、多分支只能有一个执行入口。
	var b bool = true
	if b == false {  //如果写成 b == false能编译通过吗? 如果能,结果是?
		fmt.Println("a")
	} else if b {
		fmt.Println("b")
	} else if !b {
		fmt.Println("c")
	} else {
		fmt.Println("d")
	}

	//输出是b
	//如果写成 b= false能便编译通过吗? 不能,因为if表达式不能是赋值语句为判断条件和python不同 

1.1.4 、嵌套分支

  • 在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分
    支外面的分支结构称为外层分支
    在这里插入图片描述

二、switch 分支控制

使用步骤

1switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测
试,直到匹配为止。
2、 匹配项后面也不需要再加 break
  • 请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g a 表示星期一,b 表示星期二 … 根
    据用户的输入显示相依的信息.要求使用 switch 语句完成

	var key byte
	fmt.Println("请输入一个字符, a, b, c, d, e")
	fmt.Scanf("%c", &key)

	switch key {
	case 'a':
		fmt.Println("周一")
	case 'b':
		fmt.Println("周二")
	case 'c':
		fmt.Println("周三")
	case 'd':
		fmt.Println("周四")
	case 'e':
		fmt.Println("周五")
	}


2.1 、switch 的使用的注意事项和细节

case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)

2.1.2、case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致

	var n1 int32 = 20
	var n2 int64 = 20 //错误,因为n2数据类型和n1的不一致
	switch n1 {
	case n2:
		fmt.Println("ok1")
	default:
		fmt.Println("没有匹配到")
	}

2.1.3、case 后面可以带多个表达式,使用逗号间隔。比如 case 表达式 1, 表达式 2 …

	var n1 int32 = 5
	var n2 int32 = 20
	switch n1 {
	case n2, 10, 5:  //case 后面可以有多个表达式
		fmt.Println("ok1")
	default:
		fmt.Println("没有匹配到类型")
	}

2.1.4、case 后面的表达式如果是常量值(字面量),则要求不能重复

	var n1 int32 = 5
	var n2 int32 = 20
	switch n1 {
	case n2, 10, 5: //case 后面可以有多个表达式
		fmt.Println("ok1")
	case 5: //错误,因为前面已经有了常量5,重复就会报错
		fmt.Println("ok2")

	default:
		fmt.Println("没有匹配到类型")
	}

  • case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如
    果一个都匹配不到,则执行 default
  • default 语句不是必须的

2.1.5 、switch 后也可以不带表达式,类似 if --else 分支来使用。

	var age = 10
	switch {
	case age == 10:
		fmt.Println("age==10")
	case age == 20:
		fmt.Println("age==20")
	}

三、switch 和 if 的比较

总结了什么情况下使用 switch ,什么情况下使用 if
1) 如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用 swtich
语句,简洁高效。
2) 其他情况:对区间判断和结果为 bool 类型的判断,使用 ifif 的使用范围更广

四、for 循环控制

  • go的for循环和java的类似

4.1、语法格式

4.1.1、语法格式一

for 循环变量初始化; 循环条件; 循环变量迭代 {
循环操作(语句)
}

-------
eg: 
	for i := 0; i <= 10; i++ {
		fmt.Println("你好")
	}

4.1.2、语法格式二、

for 循环判断条件 {
//循环执行语句
}
将变量初始化和变量迭代写到其它位置
-------------
eg:
	i := 0 //初始化循环变量
	for i < 11 {  //循环条件
		fmt.Println("你好")
		i++
	}

4.1.3 格式三、

for {
//循环执行语句
}

上面的写法等价 for ; ; {} 是一个无限循环, 通常需要配合 break 语句使用


	k := 1
	for {
		if k <= 10 {
			fmt.Println("你好")
		} else {
			// break //和python一样是跳出整个循环
			continue //同python 结束本次循环,继续执行
		}
		k++
	}

格式说明

1)for 循环来说,有四个要素:
2) 循环变量初始化
3) 循环条件
4) 循环操作(语句) ,有人也叫循环体。
5) 循环变量迭代

for 循环执行的顺序说明

1) 执行循环变量初始化,比如 i := 1
2) 执行循环条件, 比如 i <= 10
3) 如果循环条件为真,就执行循环操作 :比如 fmt.Println(....)
4) 执行循环变量迭代 , 比如 i++
5) 反复执行 2, 3, 4 步骤,直到 循环条件为 False ,就退出 for 循环。

4.2、举例

4.2.1、遍历字符串

	str := "hello world"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%c \n", str[i])
	}

4.2.2、字符串遍历方式 2-for - range

	str := "hello world"
	str = "abc"
	for index, val := range str {
		fmt.Printf("index=%d, str=%c \n", index, val)
	}
--------------------
	strone := "老王你好啊"
	for index, t := range strone {
		fmt.Printf("index=%d, t=%c \n", index, t)
	}

五、while循环

  • Go 语言没有 while 和 do…while 语法,这一点需要同学们注意一下,如果我们需要使用类似其它语
    言(比如 java / c 的 while 和 do…while ),可以通过 for 循环来实现其使用效果

在这里插入图片描述
说明上图

1) for 循环是一个无限循环
2) break 语句就是跳出 for 循环
	i := 1
	for {
		if i > 10 {
			break
		} else {
			fmt.Println("hello world")
			i += 1
		}
	}

六、多重循环难点

将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的 for 称为外层循环在里面的 for
循环称为内层循环。【建议一般使用两层,最多不要超过 3 层】
2) 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false
时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
3) 外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次

七、跳转控制语句-break

  • break 语句用于终止某个语句块的执行,用于中断当前 for 循环或跳出 switch 语句
  • break 跳出当前所有循环

基本语法

{ ......
break
......
}

	i := 1

	for {
		fmt.Println("hello world")
		i += 1
		if i > 10 {
			break // 直接结束 最外层的for循环
		}
	}

7.1、break可以指定跳出的循环

  • break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
  • 需要使用关键字: lable 来进行设置
lable2:
	for i := 0; i < 4; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				break lable2 //结束标签lable2 下的所有的
			}
			fmt.Println("j=", j)
		}
	}

对上面案例的说明

(1) break 默认会跳出最近的 for 循环
(2) break 后面可以指定标签,跳出标签对应的 for 循环

八、跳转控制语句-continue

8.1、基本语句介绍

continue 语句用于结束本次循环,继续执行下一次循环。
continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这
个和前面的 break 标签的使用的规则一样

8.2、基本语法

{ ......
continue
......
}
	for i := 0; i < 4; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				continue
			}
			fmt.Println("j=", j)
		}
	}
  • 上面输出是没j == 2的因为跳过了

练习

  • continue 实现 打印 1——100 之内的奇数[要求使用 for 循环+continue]
	for i := 0; i <= 100; i++ {
		if i%2 == 0 {
			continue
		}
		fmt.Println("奇数是:", i)
	}

九、跳转控制语句-goto

9.1、goto的基本介绍

1) Go 语言的 goto 语句可以无条件地转移到程序中指定的行。
2) goto 语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
3) 在 Go 程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序
都产生困难

9.2、 基本语法


goto label
.. .
label: statement

9.3、goto的流程图

在这里插入图片描述

案例


	i := 30

	fmt.Println("ok1")
	if i > 20 {
		goto lable1
	}
	fmt.Println("ok2")  // 直接跳过不执行
	fmt.Println("ok3")
	fmt.Println("ok4")
lable1:
	fmt.Println("ok5")
	fmt.Println("ok6")
	fmt.Println("ok7")
	/*
		输入是:
		ok1
		ok5
		ok6
		ok7
	*/

十、跳转控制语句-return

  • return 使用在方法或者函数中,表示跳出所在的方法或函数

10.1、说明

1) 如果 return 是在普通的函数,则表示跳出该函数,即不再执行函数中 return 后面代码,也可以
理解成终止函数。
2) 如果 return 是在 main 函数,表示终止 main 函数,也就是说终止程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lovely_red_scarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值