Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

My Blog

从此烟雨落金城,一人撑伞两人行。

第五章:控制结构

if-else结构

1
2
3
4
5
if condition {
//
} else {
//
}

当 if 结构内有 break、continue、goto 或者 return 语句时,Go 代码的常见写法是省略 else 部分

1
2
3
4
if condition {
return x
}
return y
1
2
3
4
if err != nil {
fmt.Printf("Program stopping with error %v", err)
os.Exit(1)
}

swith结构

它可以接受任意形式的表达式:

1
2
3
4
5
6
7
8
switch var1 {
case val1:
...
case val2:
...
default:
...
}

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。

一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块。

继续执行后续分支的代码,可以使用 fallthrough 关键字

1
2
3
4
5
switch i {
case 0: fallthrough
case 1:
f() // 当 i == 0 时函数也会被调用
}

可选的 default 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 if-else 语句中的 else,表示不符合任何已给出条件时,执行相关语句。

switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),然后在每个 case 分支中进行测试不同的条件。

1
2
3
4
5
6
7
8
switch {
case i < 0:
f1()
case i == 0:
f2()
case i > 0:
f3()
}

for结构

基于计数器的迭代

1
2
3
4
5
6
7
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
}

基于条件判断的迭代

1
2
3
4
5
6
7
8
9
package main
import "fmt"
func main() {
var i int = 5
for i >= 0 {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
}
}

for-range结构

for ix, val := range coll { }

val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值

1
2
3
for pos, char := range str {
...
}

标签和goto

for、switch 或 select 语句都可以配合标签(label)形式的标识符使用,即某一行第一个以冒号(:

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"
func main() {
LABEL1: // 一般建议使用全部大写字母
for i := 0; i <= 5; i++ {
for j := 0; j <= 5; j++ {
if j == 4 {
continue LABEL1
}
fmt.Printf("i is: %d, and j is: %d\n", i, j)
}
}
}

评论