0%

Go傻瓜教程4-流程控制语句

for

Go简洁得只有一种循环结构:for 循环
对,Go并没有while!
你一定很好奇怎么实现类似while (true)这样的死循环?
先看看Go中标准的for语句规格:

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

跟c很像,但是有两个地方需要注意:

  • 没有了 ( )包括条件
  • 开始条件,结束条件,循环条件都可以省略!

如果省略了前后条件的for循环看起来是这样:

1
2
3
4
5
6
7
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}

而Go版本的while就是省略了所有循环条件:

1
2
3
4
func main() {
for {
}
}

突然觉得用了好久的while语句好像是有点多余。。

if

跟 for 一样,if 语句也是不用( )

1
2
3
4
5
func test() {
if x < 0 {
return true
}
}

if 语句可以在条件之前执行一个简单的语句:

1
2
3
4
5
func test(a,b) {
if x := math.Pow(a, b);x < 0 {
return true
}
}

只是由这个语句定义的变量的作用域仅在if范围之内,和对应的else范围。

switch

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}

switch 语句用法和其他语言差不多,只允许有一个default,同样允许在switch语句里面赋值.

fallthrough

Go 提供fallthrough 可以执行执行完一个case之后继续下一个:

1
2
3
4
5
6
7
8
9
10
func main() {
a:=true
switch a {
case true:
fmt.Println(1)
fallthrough
case false:
fmt.Println(2)
}
}

defer

Go 提供defer语句,实现延迟函数的执行直到上层函数返回:

1
2
3
4
5
6
7
8
9
func main() {
fmt.Println("counting")

for i := 0; i < 10; i++ {
defer fmt.Println(i)
}

fmt.Println("done")
}

结果:

counting
done
9
8
7
6
5
4
3
2
1
0

暂时先知道defer可以实现延时执行功能。


总结

  • Go中的while使用for实现
  • switch可以使用fallthrough继续下一个case分支
  • defer 关键字可以提供延时执行效果