[TOC]
## if 語句
### 定義
~~~
? 可省略條件表達式括號。
? 持初始化語句,可定義代碼塊局部變量。
? 代碼塊左 括號必須在條件表達式尾部。
if 布爾表達式 {
/* 在布爾表達式為 true 時執行 */
}
~~~
~~~
if 布爾表達式 {
/* 在布爾表達式為 true 時執行 */
} else {
/* 在布爾表達式為 false 時執行 */
}
~~~
## switch 語句
### 定義
~~~
switch var1 {
case val1:
...
case val2:
...
default:
...
}
~~~
### Type Switch
``` go
package main
import "fmt"
func main() {
var x interface{}
//寫法一:
switch i := x.(type) { // 帶初始化語句
case nil:
fmt.Printf(" x 的類型 :%T\r\n", i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型")
default:
fmt.Printf("未知型")
}
```
## select 語句
select 語句類似于 switch 語句,但是select會隨機執行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。
select 是Go中的一個控制結構,類似于用于通信的switch語句。每個case必須是一個通信操作,要么是發送要么是接收。 select 隨機執行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。一個默認的子句應該總是可運行的。
### 語法
~~~
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數量的 case */
default : /* 可選 */
statement(s);
}
~~~
~~~
每個case都必須是一個通信
所有channel表達式都會被求值
所有被發送的表達式都會被求值
如果任意某個通信可以進行,它就執行;其他被忽略。
如果有多個case都可以運行,Select會隨機公平地選出一個執行。其他不會執行。
否則:
如果有default子句,則執行該語句。
如果沒有default字句,select將阻塞,直到某個通信可以運行;Go不會重新對channel或值進行求值。
~~~
``` go
package main
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
```
>與switch語句可以選擇任何使用相等比較的條件相比,select由比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作
``` go
package main
import "fmt"
func main() {
var c1, c2, c3 chan int
var i1, i2 int
select {
case i1 = <-c1:
fmt.Printf("received ", i1, " from c1\n")
case c2 <- i2:
fmt.Printf("sent ", i2, " to c2\n")
case i3, ok := (<-c3): // same as: i3, ok := <-c3
if ok {
fmt.Printf("received ", i3, " from c3\n")
} else {
fmt.Printf("c3 is closed\n")
}
default:
fmt.Printf("no communication\n")
}
}
//輸出:no communication
```
## for 循環
### 定義
~~~
for init; condition; post { }
for condition { }
for { }
~~~
``` go
s := "abc"
for i, n := 0, len(s); i < n; i++ { // 常見的 for 循環,支持初始化語句。
println(s[i])
}
n := len(s)
for n > 0 { // 替代 while (n > 0) {}
println(s[n]) // 替代 for (; n > 0;) {}
n--
}
for { // 替代 while (true) {}
println(s) // 替代 for (;;) {}
}
```
## 循環語句range
~~~
for key, value := range oldMap {
newMap[key] = value
}
~~~