文章目录
  1. 1. if 声明
  2. 2. for循环
  3. 3. Switch case 声明

Go语言中主要有三种控制流程if,for循环,switch case语句。

if 声明

Go中的if声明,除了不需要()和必需{}之外,其它跟CJava类似的。 像for语句一样,if语句可以在条件执行语句前有一个简短的声明,在if声明中声明的参数,其作用仅限于if语句体。在if语句体中声明的变量,有效作用域也仅限于本语句体.

if声明示例

1
2
3
if answer != 42 {
return "Wrong answer"
}

if简短初始化声明示例

1
2
3
if err := foo(); err != nil {
panic(err)
}

for循环

Go语言中只有一个循环结构,for循环. 基本的for循环体与CJava语言类似,只是不需要(),必需{}. 并且和在CJava中一个,可以给前置条件和后置声明留空.

1
2
3
4
sum := 0
for i := 0; i < 10; i++ {
sum += i
}

前置条件和后置声明赋空示例

1
2
3
4
sum := 1
for ; sum < 1000; {
sum += sum
}

for完成while功能

1
2
3
4
sum := 1
for sum < 1000 {
sum += sum
}

无限循环示例

1
2
3
for {
// do something in a loop forever
}

Switch case 声明

多数开发语言都有Switch case控制流程,用于避免复杂的if else语句

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

import (
"fmt"
"time"
)

func main() {
now := time.Now().Unix()
mins := now % 2
switch mins {
case 0:
fmt.Println("even")
case 1:
fmt.Println("odd")
}
}

但是Go语言中的Switch case还是有如下差别的

  • 只能对同类型数据进行比对
  • 如果所有case都没有命中的化,可以设置一个default语句执行默认的操作.
  • 可以在case声明中使用表达式,例如可以在声明中计算某个值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

func main() {
num := 3
v := num % 2
switch v {
case 0:
fmt.Println("even")
case 3 - 2:
fmt.Println("odd")
}
}

也可以在一个case声明中放多个条件值

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() {
score := 7
switch score {
case 0, 1, 3:
fmt.Println("Terrible")
case 4, 5:
fmt.Println("Mediocre")
case 6, 7:
fmt.Println("Not bad")
case 8, 9:
fmt.Println("Almost perfect")
case 10:
fmt.Println("hmm did you cheat?")
default:
fmt.Println(score, " off the chart")
}
}

还可以通过关键字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
34
35
36
37
38
package main

import "fmt"

func main() {
n := 4
switch n {
case 0:
fmt.Println("is zero")
fallthrough
case 1:
fmt.Println("is <= 1")
fallthrough
case 2:
fmt.Println("is <= 2")
fallthrough
case 3:
fmt.Println("is <= 3")
fallthrough
case 4:
fmt.Println("is <= 4")
fallthrough
case 5:
fmt.Println("is <= 5")
fallthrough
case 6:
fmt.Println("is <= 6")
fallthrough
case 7:
fmt.Println("is <= 7")
fallthrough
case 8:
fmt.Println("is <= 8")
fallthrough
default:
fmt.Println("Try again!")
}
}

the result:

1
2
3
4
5
6
is <= 4
is <= 5
is <= 6
is <= 7
is <= 8
Try again!

也可以使用break关键字退出switch 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"
"time"
)

func main() {
n := 1
switch n {
case 0:
fmt.Println("is zero")
fallthrough
case 1:
fmt.Println("<= 1")
fallthrough
case 2:
fmt.Println("<= 2")
fallthrough
case 3:
fmt.Println("<= 3")
if time.Now().Unix()%2 == 0 {
fmt.Println("un pasito pa lante maria")
break
}
fallthrough
case 4:
fmt.Println("<= 4")
fallthrough
case 5:
fmt.Println("<= 5")
}
}

the result:

1
2
3
4
<= 1
<= 2
<= 3
un pasito pa lante maria

练习题

将50个硬币分给10个用户: Matthew, Sarah, Augustus, Heidi, Emilie, Peter, Giana, Adriano, Aaron, Elizabeth; 硬币根据名字中包含的元音来分配,分配规则:
a: 1 coin e: 1 coin i: 2 coins o: 3 coins u: 4 coins

并且每个用户最多不能超过10个硬币, 打印这个map, 用户的名字为key, 分得的硬币为value. 分完所以硬币之后, 应该还有两个硬币剩余.

预期输出结果:

1
2
map[Matthew:2 Peter:2 Giana:4 Adriano:7 Elizabeth:5 Sarah:2 Augustus:10 Heidi:5 Emilie:6 Aaron:5]
Coins left: 2

注意Go中的map是无序的,但是最终的输出结果应该跟上面是一样的.

开始代码

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

import "fmt"

var (
coins = 50
users = []string{
"Matthew", "Sarah", "Augustus", "Heidi", "Emilie",
"Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
}
distribution = make(map[string]int, len(users))
)

func main() {
fmt.Println(distribution)
fmt.Println("Coins left:", coins)
}

练习题解答

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
package main

import "fmt"

var (
coins = 50
users = []string{
"Matthew", "Sarah", "Augustus", "Heidi", "Emilie",
"Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
}
distribution = make(map[string]int, len(users))
)

func main() {
coinsForUser := func(name string) int {
var total int
for i := 0; i < len(name); i++ {
switch string(name[i]) {
case "a", "A":
total++
case "e", "E":
total++
case "i", "I":
total = total + 2
case "o", "O":
total = total + 3
case "u", "U":
total = total + 4
}
}
return total
}

for _, name := range users {
v := coinsForUser(name)
if v > 10 {
v = 10
}
distribution[name] = v
coins = coins - v
}
fmt.Println(distribution)
fmt.Println("Coins left:", coins)
}

作者署名:朴实的一线攻城狮
本文标题:[译]GO BOOTCAMP 第五章:控制流程
本文出处:http://researchlab.github.io/2016/01/21/go-control/
版权声明:本文由Lee Hong创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处, 否则保留追究法律责任的权利。

@一线攻城狮

关注微信公众号 @一线攻城狮

总访问:
总访客: