iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
1
Software Development

啥物碗Golang? 30天就Go系列 第 5

條件執行與For循環

條件是程式語言能夠實現商業邏輯的基礎元素。有了條件判斷,我們才能夠寫下要買十個西瓜還是三個包子之類的方法。

If...else if

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時會執行的程式片段 */
}

Switch

一般來說,如果一個變數使用超過三個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" );
}

Type switch

可以觀察到結構有些微的不同。除了變數以外,還有一種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

Fallthrough

這邊介紹一個稍微高階一點的用法,在某些特殊情況下,我們的業務邏輯可能會需要執行不只一個case,這個時候我們就可以搭配break使用fallthrough,範例如下:

switch{
    case 1:
    ...
    if(...){
        break
    }

    fallthrough

    case 2:
    ...
    case 3:
}

這個時候switch(1)會同時執行case1和case2;除非滿足if條件觸發break,在這種情況下只有執行case1。

For循環

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等集合。

Reference


上一篇
基本類別與自訂類別
下一篇
函數 Function
系列文
啥物碗Golang? 30天就Go30

尚未有邦友留言

立即登入留言