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 true
,case
可以是一个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
的函数都压入栈中,在外围函数返回时以后进先出的顺序来执行。