漫游Go语言(二)之流程控制与defer
for循环
Go只是一种循环控制语句for
,由分号;
分开的三部分作为与C同,其初始化部分通常用:=
形式的短声明,其作用域只在循环内。1
2
3
4
5
6
7
8
9
10
11package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
注意与C
,java
等不同的是,条件部分无括号,而循环体的{}
则不可省略。初始化与post循环体语句可省略,;
也可以省略,如果什么都不带,则代表死循环。1
2
3
4
5
6
7
8
9
10
11package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
死循环1
2
3
4
5
6package main
func main() {
for {
}
}
if
与for
类似,()
可省略但{}
不可省略,而且也可以指定预执行语句,其中声明的变量作用域为if
+else
语句体。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// can't use v here, though
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
练习:循环与函数
使用牛顿的求平方根方式来练习循环与函数。
其中Zn为任意选取值,经过公式的多次迭代后,就可以无限逼近真实值。
以下分别是题目和个人完成后的程序,建议自行完成,花不了2分钟,算是对语言的一种熟悉。1
2
3
4
5
6
7
8
9
10
11
12package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
}
func main() {
fmt.Println(Sqrt(2))
}
个人答案1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package main
import (
"fmt"
"math"
)
func OneIter(x,z float64)float64{
return z-(z*z-x)/(2.0*z)
}
func Sqrt(x float64) float64 {
z:=2.0
for i:=0;i<3;i++{
z = OneIter(x,z)
}
return z
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(math.Sqrt(2))
}
其结果与初始值的选定很有关系,比如上次只三次迭代后,结果就已十分接近。1
2
3
41.4142156862745099
1.4142135623730951
Program exited.
switch
Go也有Switch
语句,不同的是它默认每个case
都自动break
,除非在末尾使用fallthrough
关键字。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package main
import (
"fmt"
"runtime"
)
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计算顺序和无条件的switch
从上到下执行,至于匹配的case
就结束,而无条件的switch
语句等同于switch true
,case
可以是一个test,综合以上二特性可用来实现某些长的if-else-if…逻辑。
1 | package main |
defer关键字
defer
可以延迟一个函数到外围函数执行完后再执行,但其参数值是立即计算的。1
2
3
4
5
6
7
8
9
10package main
import "fmt"
func main() {
x:=10
defer fmt.Printf("world ",x)
x--
fmt.Println("hello " ,x)
}
结果1
2
3hello 9
world %!(EXTRA int=10)
Program exited.
如果有多个defer
, 那么需要了解被defer
的函数都压入栈中,在外围函数返回时以后进先出的顺序来执行。