這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
7.蛤蟆筆記go語言——if,switch,defer
if
if 語句除了沒有了 `( )` 之外(甚至強制不能使用它們),看起來跟 C 或者 Java 中的一樣,而 `{ }` 是必須的。
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x< 0 {
returnsqrt(-x) + "i"
}
returnfmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2),sqrt(-4))
}
執行:
1.4142135623730951 2i
跟 for 一樣,`if` 語句可以在條件之前執行一個簡單的語句。
由這個語句定義的變數的範圍僅在 if 範圍之內。
(在最後的 return 語句處使用 v 看看。)
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v :=math.Pow(x, n); v < lim {
returnv
}
returnlim
}
func main() {
fmt.Println(
pow(3,2, 10),
pow(3,3, 20),
)
}
執行結果如下:
920
在 if 的便捷語句定義的變數同樣可以在任何對應的 else 塊中使用。
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v :=math.Pow(x, n); v < lim {
returnv
} else{
fmt.Printf("%g>= %g\n", v, lim)
}
// 這裡開始就不能使用 v了
returnlim
}
func main() {
fmt.Println(
pow(3,2, 10),
pow(3,3, 20),
)
}
執行結果:
27>= 20
920
switch
一個結構體(`struct`)就是一個欄位的集合。
除非以 fallthrough 語句結束,否則分支會自動終止。
執行:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Print("Goruns on ")
switchos := runtime.GOOS; os {
case"darwin":
fmt.Println("OSX.")
case"linux":
fmt.Println("Linux.")
default:
//freebsd, openbsd,
//plan9, windows...
fmt.Printf("%s.",os)
}
}
結果:
Goruns on windows.
switch 的執行順序
switch 的條件從上到下的執行,當匹配成功的時候停止。
(例如,
switch i {
case 0:
case f():
}
當 i==0 時不會調用 `f`。)
代碼:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("When'sSaturday?")
today:= time.Now().Weekday()
switchtime.Saturday {
casetoday + 0:
fmt.Println("Today.")
casetoday + 1:
fmt.Println("Tomorrow.")
casetoday + 2:
fmt.Println("Intwo days.")
default:
fmt.Println("Toofar away.")
}
}
執行:
When'sSaturday?
Toofar away.
沒有條件的 switch
沒有條件的 switch 同 `switch true` 一樣。
這一構造使得可以用更清晰的形式來編寫長的 if-then-else 鏈。
package main
import (
"fmt"
"time"
)
func main() {
t :=time.Now()
switch{
caset.Hour() < 12:
fmt.Println("Goodmorning!")
caset.Hour() < 17:
fmt.Println("Goodafternoon.")
default:
fmt.Println("Goodevening.")
}
}
執行:
Goodevening.
defer
defer 語句會延遲函數的執行直到上層函數返回。
延遲調用的參數會立刻產生,但是在上層函數返回前函數都不會被調用。
代碼:
package main
import "fmt"
func main() {
deferfmt.Println("world")
fmt.Println("hello")
}
執行如下:
hello
world
defer 棧
延遲的函數調用被壓入一個棧中。當函數返回時,會按照後進先出的順序調用被延遲的函數調用。
代碼:
package main
import "fmt"
func main() {
fmt.Println("counting")
for i:= 0; i < 10; i++ {
deferfmt.Println(i)
}
fmt.Println("done")
}
執行:
counting
done
9
8
7
6
5
4
3
2
1
0