Contents
  1. 1. for循环
  2. 2. if
  3. 3. 练习:循环与函数
  4. 4. switch
    1. 4.1. switch计算顺序和无条件的switch
  5. 5. defer关键字

for循环

Go只是一种循环控制语句for,由分号;分开的三部分作为与C同,其初始化部分通常用:=形式的短声明,其作用域只在循环内。

1
2
3
4
5
6
7
8
9
10
11
package 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
11
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}

死循环

1
2
3
4
5
6
package 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
23
package 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
12
package 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
23
package 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
4
1.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
20
package 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 truecase可以是一个test,综合以上二特性可用来实现某些长的if-else-if…逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}

defer关键字

defer可以延迟一个函数到外围函数执行完后再执行,但其参数值是立即计算的。

1
2
3
4
5
6
7
8
9
10
package main
import "fmt"
func main() {
x:=10
defer fmt.Printf("world ",x)
x--
fmt.Println("hello " ,x)
}

结果

1
2
3
hello 9
world %!(EXTRA int=10)
Program exited.

如果有多个defer, 那么需要了解被defer的函数都压入栈中,在外围函数返回时以后进先出的顺序来执行。

Contents
  1. 1. for循环
  2. 2. if
  3. 3. 练习:循环与函数
  4. 4. switch
    1. 4.1. switch计算顺序和无条件的switch
  5. 5. defer关键字