go语言学习笔记之三---流程控制

每一个矜持淡定的现在,都有一个很傻很天真的曾经

Posted by yishuifengxiao on 2020-09-15

一 选择结构

1.1 if语句

Go 编程语言中 if 语句的语法如下:

1
2
3
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
}

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。

1.1.1 if 基本使用
1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
var a int = 3
//条件表达式没有括号
if a == 3 {
fmt.Println("a==3")
}
}
1.1.1 if 初始化表达式

支持一个初始化表达式, 初始化字句和条件表达式直接需要用分号分隔

Go 的 if 还有一个强大的地方就是条件判断语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {

if b := 3; b == 3 {
fmt.Println("b==3")
}

}
1.1.3 if … else
1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
if a := 3; a == 4 {
fmt.Println("a==4")
}
else { //左大括号必须和条件语句或else在同一行
fmt.Println("a!=4")
}
}
1.1.4 if … else if … else
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import "fmt"

func main() {
if a := 3; a > 3 {

fmt.Println("a>3")

} else if a < 3 {

fmt.Println("a<3")

} else if a == 3 {

fmt.Println("a==3")

} else {

fmt.Println("error")

}
}

1.2 switch语句

1.2.1 基本使用

Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import "fmt"

func main() {
var score int = 90

switch score {

case 90:

fmt.Println("优秀")

//fallthrough

case 80:

fmt.Println("良好")

//fallthrough

case 50, 60, 70:

fmt.Println("一般")

//fallthrough

default:

fmt.Println("差")

}
}
1.2.2 进阶使用

可以使用任何类型或表达式作为条件语句:

示例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func main() {

switch s1 := 90; s1 { //初始化语句;条件

case 90:

fmt.Println("优秀")

case 80:

fmt.Println("良好")

default:

fmt.Println("一般")

}
}

示例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import "fmt"

func main() {
var s2 int = 90

switch { //这里没有写条件

case s2 >= 90: //这里写判断语句

fmt.Println("优秀")

case s2 >= 80:

fmt.Println("良好")

default:

fmt.Println("一般")

}

}

示例3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main() {
switch s3 := 90; { //只有初始化语句,没有条件

case s3 >= 90: //这里写判断语句

fmt.Println("优秀")

case s3 >= 80:

fmt.Println("良好")

default:

fmt.Println("一般")

}
}

二 循环语句

2.1 for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {

var i, sum int

for i = 1; i <= 10; i++ {

sum += i

}

fmt.Println("sum = ", sum)
}

2.2 range

关键字 range 会返回两个值,第一个返回值是元素的数组下标,第二个返回值是元素的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

func main() {

s := "abc"

for i := range s { //支持 string/array/slice/map。

fmt.Printf("%c\n", s[i])

}

for _, c := range s { // 忽略 index

fmt.Printf("%c\n", c)

}

for i, c := range s {

fmt.Printf("%d, %c\n", i, c)

}
}

三 跳转语句

3.1 break和continue

在循环里面有两个关键操作breakcontinuebreak操作是跳出当前循环,continue是跳过本次循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main() {

for i := 0; i < 5; i++ {

if 2 == i {

//break //break操作是跳出当前循环

continue //continue是跳过本次循环

}

fmt.Println(i)

}

}

注意:break可⽤于forswitchselect,⽽continue仅能⽤于for循环。

3.2 goto

goto跳转到必须在当前函数内定义的标签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import "fmt"

func main() {

for i := 0; i < 5; i++ {

for {

fmt.Println(i)

goto LABEL //跳转到标签LABEL,从标签处,执行代码

}

}

fmt.Println("this is test")

LABEL:

fmt.Println("it is over")

}