Go by Example - 流程控制语句

Go by Example - 流程控制语句

介绍go中的流程控制语句: for, if/else, switch

For

for是 Go 唯一的循环结构, 以下是一些基本的循环类型for:

for.go
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
34
package main

import (
"fmt"
)

func main() {
i := 1
// 最基本的类型,具有单一条件
for i <= 3 {
fmt.Println(i)
i++
}
// 经典的 循环初始化/循环条件/循环操作 for循环
for j := 4; j <= 6; j++ {
fmt.Println(j)
}
// 完成基本的"执行 N 次"迭代的另一种方法是range使用整数。
for i := range 3 {
fmt.Println("range", i)
}
// for没有条件将重复循环,直到break跳出循环或return退出封闭函数
for {
fmt.Println("loop")
break
}
// 还可以continue进行循环的下一次迭代
for n := range 6 {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
}
log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ go run for.go
1
2
3
0
1
2
range 0
range 1
range 2
loop
1
3
5

If/Else

Go 中没有三元操作符(a ? b : c), 因此即使对于基本条件, 也需要使用完整的语句。Go 中的条件不需要括号,但大括号是必需的, 以下是一些基本的 if/else 条件语句示例:

if-else.go
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
package main

import (
"fmt"
)

func main() {
// 基本用法
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
// 可以有一个只有 if 没有 else 的语句
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
// 像 && 和 || 这样的逻辑运算符在条件语句中很有用
if 8%2 == 0 || 7%2 == 0 {
fmt.Println("either 8 or 7 are even")
}
// 在条件语句之前可以有一条语句; 该语句中声明的任何变量都可以在当前分支和所有后续分支中使用:
if num := 1; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digit")
}
}
log
1
2
3
4
5
$ go run if-else.go
7 is odd
8 is divisible by 4
either 8 or 7 are even
9 has 1 digit

Switch

switch 语句是跨多个分支的条件, Go 只会运行选定的 case, 而非之后所有的 case。在效果上,Go 的做法相当于这些语言中为每个 case 后面自动添加了所需的 break 语句, 除非以 fallthrough 语句结束, 否则分支会自动终止:

switch.go
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main

import (
"fmt"
"time"
)

func main() {
// 这是一个基本的 switch
i := 1
fmt.Print("Write ", i, " as ")
switch i {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
}
// 可以使用逗号分隔同一 case 语句中的多个表达式, 我们在这个例子中也使用了可选的 default
switch time.Now().Weekday() {
case time.Saturday, time.Sunday:
fmt.Println("it's weekend")
default:
fmt.Println("it's not weekend")
}
// 不带表达式的 switch 是表示 if/else 逻辑的另一种方式(无条件的 switch 同 switch true 一样), 这里我们还展示了 case 表达式是无需为常量且取值不限于整数
now := time.Now()
switch {
case now.Hour() < 12:
fmt.Println("am")
default:
fmt.Println("pm")
}
// 类型 switch 比较类型而不是值, 可以使用它来发现接口值的类型, 在本例中, 变量t将具有与其子句对应的类型: (不理解这里的应用场景, 而且这个写法和类型断言很相似, 也很不理解这里的写法)
what_type := func(i interface{}) {
switch t := i.(type) {
case int:
fmt.Printf("type of %d: int", t)
case string:
fmt.Printf("type of %v: string", t)
default:
fmt.Println("none")
}
}
what_type("1")
what_type(1)
}
log
1
2
3
4
5
6
7
$ go run switch.go
Write 2 as two
It's a weekday
It's after noon
I'm a bool
I'm an int
Don't know type string

参考链接

作者

孤独小狼

发布于

2024-01-14

更新于

2024-01-14

许可协议

评论