條件是程式語言能夠實現商業邏輯的基礎元素。有了條件判斷,我們才能夠寫下要買十個西瓜還是三個包子之類的方法。
go的if結構如下:
if bool {
/* bool == true時會執行的程式片段 */
}
很遺憾的,go並不支援一行的if簡寫法與三元運算子(ternary operator),所以在go你不能寫下列這種if句子:
//ruby one line if
doSomething if bool
//ruby ternary operator
a = bool ? "I'm true" : "I'm false"
最接近三元運算子的寫法如下:
var a string
if a = "I'm false"; bool {
a = "I'm true"
}
另外,go好像也沒有unless
可以用,恩,就乖乖使用最少三行的if
吧。如果需要加上更多條件,則可以使用else if
與預設的else
if bool1 {
/* bool1 == true時會執行的程式片段 */
}else if bool2 {
/* boo2 == true時會執行的程式片段 */
}else{
/* bool1,bool2 != true時會執行的程式片段 */
}
一般來說,如果一個變數使用超過三個if判斷條件的話,我們會建議使用case when
,在go稱之為switch
,適用於多種狀況的條件判斷,結構如下:
switch var1 {
case var1:
...
case var2:
...
default:
...
}
var1與var2可以是任何類別,但一定要一致。default
可以省略,如果有的話,當所有的case
皆不符合的時候,就會執行default內的程式片段。我們來看看實際的例子:
switch age {
case 15: grade = "志於學"
case 30: grade = "而立"
case 40: grade = "不惑"
case 50: grade = "知天命"
case 60: grade = "耳順"
case 70,80,90 : grade = "從心所欲,不踰矩"
}
抱歉這例子有點老派(擦臉),總之,條件可以不只一個。條件也可以寫在case之內:
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" );
}
可以觀察到結構有些微的不同。除了變數以外,還有一種switch稱之為type switch
,顧名思義作為條件判斷的是類別,我們可以觀察下面的例子:
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>
。因為x
並沒有賦值,初始值為nil
。
這邊介紹一個稍微高階一點的用法,在某些特殊情況下,我們的業務邏輯可能會需要執行不只一個case,這個時候我們就可以搭配break使用fallthrough,範例如下:
switch{
case 1:
...
if(...){
break
}
fallthrough
case 2:
...
case 3:
}
這個時候switch(1)
會同時執行case1和case2;除非滿足if條件觸發break,在這種情況下只有執行case1。
go似乎只有一種循環,就是for循環。但主要有三種結構:
// for condition {}
var b int = 15
var a int
for a < b {
a++
fmt.Printf("a 的值為: %d\n", a)
}
滿足條件(condition)時就會停止,執行循環外的程式。要特別注意,如果條件永遠無法滿足,就會變成無窮迴圈!
// for init; condition; post { }
for a := 0; a < 10; a++ {
fmt.Printf("a 的值為: %d\n", a)
}
這種結構在javascript也很常見,三個元素分別是初值、條件、運算元(遞增或遞減)。
// for index, range, collection {}
numbers := [6]int{1, 2, 3, 5}
for i,x:= range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}
其中range對應的可以是map、slice、array等集合。