datetime:2020/9/16 11:41
author:nzb
Go的流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉"
Go 语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。
1、条件语句
1.1、if else
推荐if后面不适用括号,当然也可以使用括号括起来
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
} else {
/* 在布尔表达式为 false 时执行 */
}
func main() {
var num = 10
if num == 10 {
fmt.Println("hello == 10")
} else if(num > 10) {
fmt.Println("hello > 10")
} else {
fmt.Println("hello < 10")
}
}
if的另外一种写法,下面的方法的区别是 num2是局部变量
if num2:= 10; num2>=10 {
fmt.Println("hello >=10")
fmt.Println(num2) // 可打印
}
fmt.Println(num2) // 报错,因为 num2 是局部变量
if 语句嵌套
if 布尔表达式 1 {
/* 在布尔表达式 1 为 true 时执行 */
if 布尔表达式 2 {
/* 在布尔表达式 2 为 true 时执行 */
}
}
你可以以同样的方式在 if 语句中嵌套 else if...else 语句
1、if 后的 大括号
{}
不能省略2、
{
必须紧挨着条件
1.2、switch case
使用switch语句可方便的对大量的值进行条件判断
switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
extname := ".a"
switch extname {
case ".html": {
fmt.Println(".html")
break
}
case ".doc": {
fmt.Println(".doc")
break
}
case ".js": {
fmt.Println(".js")
}
default: {
fmt.Println("其它后缀")
}
}
switch的另外一种写法
switch extname := ".a"; extname {
case ".html": {
fmt.Println(".html")
break
}
case ".doc": {
fmt.Println(".doc")
break
}
case ".js": {
fmt.Println(".js")
}
default: {
fmt.Println("其它后缀")
}
}
同时一个分支可以有多个值
extname := ".txt"
switch extname {
case ".html": {
fmt.Println(".html")
break
}
case ".txt",".doc": {
fmt.Println("传递来的是文档")
break
}
case ".js": {
fmt.Println(".js")
}
default: {
fmt.Println("其它后缀")
}
}
tip:在golang中,break可以不写,也能够跳出case,而不会执行其它的。
如果我们需要使用switch的穿透 fallthrought,fallthrough语法可以执行满足条件的 case 的下一个case,为了兼容c语言中的case设计
extname := ".txt"
switch extname {
case ".html": {
fmt.Println(".html")
fallthrought
}
case ".txt",".doc": {
fmt.Println("传递来的是文档")
fallthrought
}
case ".js": {
fmt.Println(".js")
fallthrought
}
default: {
fmt.Println("其它后缀")
}
}
fallthrought 只能穿透紧挨着的一层,不会一直穿透,但是如果每一层都写的话,就会导致每一层都进行穿透
2、循环语句
2.1、for 循环结构
Go语言中的所有循环类型均可使用for关键字来完成
for循环的基本格式如下:
for 初始语句; 条件表达式; 结束语句 {
循环体
}
第一种写法:
for i := 1 ; i <= 10; i++ { fmt.Println(i) }
第二种写法:和 C 的 while 一样:
for condition { }
示例:
i := 1
for ; i <= 10; i++ {
fmt.Println(i)
}
- 第三种写法
i := 1
for i <= 10{
fmt.Println(i)
i++
}
- 第四种写法:和 C 的 for(;;) 一样:
for { }
示例:
i := 1
for {
if i <= 10{
fmt.Println(i)
}else{
break
}
i++
}
条件表达式返回true时循环体不停地进行循环,直到条件表达式返回false时自动退出循环
实例:打印1 ~ 10
for i := 0; i < 10; i++ {
fmt.Printf("%v ", i+1)
}
2.2、for range(键值循环)
Go 语言中可以使用for range遍历数组、切片、字符串、map及通道(channel)。通过for range遍历的返回值有以下规律:
for key, value := range oldMap {
newMap[key] = value
}
- 数组、切片、字符串返回索引和值。
- map返回键和值。
- 通道(channel)只返回通道内的值。
实例:遍历字符串
var str = "你好golang"
for key, value := range str {
fmt.Printf("%v - %c ", key, value)
}
遍历切片(数组)
var array = []string{"php", "java", "node", "golang"}
for index, value := range array {
fmt.Printf("%v %s ", index, value)
}
for循环可以通过break、goto、return、panic语句退出循环
2.3、循环嵌套
for [condition | ( init; condition; increment ) | Range]
{
for [condition | ( init; condition; increment ) | Range]
{
statement(s);
}
statement(s);
}
2.4、循环控制语句
2.4.1、break:跳出循环
Go语言中break 语句用于以下几个方面:
- 用于循环语句中跳出循环,并开始执行循环之后的语句。
- break在switch(开关语句)中在执行一条case后跳出语句的作用。
- 在多重循环中,可以用标号label标出想break的循环。
var i = 0
for {
if i == 10{
fmt.Println("跳出循环")
break
}
i++
fmt.Println(i)
}
使用label
package main
import "fmt"
func main() {
// 不使用标记
fmt.Println("---- break ----")
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
break
}
}
// 使用标记
fmt.Println("---- break label ----")
re:
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
break re
}
}
}
---- break ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
---- break label ----
i: 1
i2: 11
2.4.2、 continue:跳过当前循环的剩余语句,然后继续进行下一轮循环
- Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。
- for 循环中,执行 continue 语句会触发 for 增量语句的执行。
- 在多重循环中,可以用标号 label 标出想 continue 的循环。
package main
import "fmt"
func main() {
// 不使用标记
fmt.Println("---- continue ---- ")
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue
}
}
// 使用标记
fmt.Println("---- continue label ----")
re:
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue re
}
}
}
---- continue ----
i: 1
i2: 11
i2: 12
i2: 13
i: 2
i2: 11
i2: 12
i2: 13
i: 3
i2: 11
i2: 12
i2: 13
---- continue label ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
2.4.3、 goto:跳转到指定标签
- Go 语言的 goto 语句可以无条件地转移到过程中指定的行。
- goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
- 但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
goto label;
..
.
label: statement;
var n = 20
if n > 24 {
fmt.Println("成年人")
} else {
goto lable3
}
fmt.Println("aaa")
fmt.Println("bbb")
lable3:
fmt.Println("ccc")
fmt.Println("ddd")