## 一、if

#### 實例
~~~
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 100
/* 使用 if 語句判斷布爾表達式 */
if a < 200 {
/* 如果條件為 true 則執行以下語句 */
fmt.Printf("a 的值小于 200\n")
}
fmt.Printf("a 的值為 : %d\n", a)
}
~~~
執行結果:
a 小于 200
a 的值為 : 100
## 二、if...else

#### 實例:
~~~
package main
import "fmt"
func main() {
/* 局部變量定義 */
var a int = 100
/* 判斷布爾表達式 */
if a < 20 {
/* 如果條件為 true 則執行以下語句 */
fmt.Printf("a 小于 20\n")
} else {
/* 如果條件為 false 則執行以下語句 */
fmt.Printf("a 大于 20\n")
}
fmt.Printf("a 的值為 : %d\n", a)
}
~~~
執行結果:
a 大于 20
a 的值為 : 100
## 三、switch

語法:
~~~
switch var1 {
case val1:
...
case val2:
...
default:
...
}
~~~
#### 1、實例
~~~
package main
import "fmt"
func main() {
/* 定義局部變量 */
var grade string = "B"
var marks int = 90
switch marks {
case 90:
grade = "A"
case 80:
grade = "B"
case 50, 60, 70:
grade = "C"
default:
grade = "D"
}
switch {
case grade == "A":
fmt.Printf("優秀!\n")
case grade == "B", grade == "C":
fmt.Printf("良好\n")
case grade == "D":
fmt.Printf("及格\n")
case grade == "F":
fmt.Printf("不及格\n")
default:
fmt.Printf("差\n")
}
fmt.Printf("你的等級是 %s\n", grade)
}
~~~
執行結果:
優秀!
你的等級是 A
#### 2、Type Switch
switch 語句還可以被用于 type-switch 來判斷某個 interface 變量中實際存儲的變量類型。
語法:
~~~
switch x.(type){
case type:
statement(s);
case type:
statement(s);
/* 你可以定義任意個數的case */
default: /* 可選 */
statement(s);
}
~~~
~~~
package main
import "fmt"
func main() {
var x interface{}
switch i := x.(type) {
case nil:
fmt.Printf(" x 的類型 :%T", 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("未知型")
}
}
~~~
執行結果:
x 的類型 :<nil>
#### 3、fallthrough
使用 fallthrough 會強制執行后面的 case 語句,fallthrough 不會判斷下一條 case 的表達式結果是否為 true。
~~~
package main
import "fmt"
func main() {
switch {
case false:
fmt.Println("1、case 條件語句為 false")
fallthrough
case true:
fmt.Println("2、case 條件語句為 true")
fallthrough
case false:
fmt.Println("3、case 條件語句為 false")
fallthrough
case true:
fmt.Println("4、case 條件語句為 true")
case false:
fmt.Println("5、case 條件語句為 false")
fallthrough
default:
fmt.Println("6、默認 case")
}
}
~~~
執行結果:
2、case 條件語句為 true
3、case 條件語句為 false
4、case 條件語句為 true
## 四、select 語句
select 是 Go 中的一個控制結構,類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要么是發送要么是接收。
select 隨機執行一個可運行的 case。如果沒有 case 可運行,它將阻塞,直到有 case 可運行。一個默認的子句應該總是可運行的。
語法:
```
select{
casecommunication clause ?:
? ? ? ?statement(s);
casecommunication clause ?:
? ? ? ?statement(s);
/* 你可以定義任意數量的 case */
default:/* 可選 */
? ? ? ?statement(s);
}
```
* 每個 case 都必須是一個通信
* 所有 channel 表達式都會被求值
* 所有被發送的表達式都會被求值
* 如果任意某個通信可以進行,它就執行,其他被忽略。
* 如果有多個 case 都可以運行,Select 會隨機公平地選出一個執行。其他不會執行。
否則:
1. 如果有 default 子句,則執行該語句。
2. 如果沒有 default 子句,select 將阻塞,直到某個通信可以運行;Go 不會重新對 channel 或值進行求值。