天天看點

Go語言之分支結構(十一)

Go語言分支結構

一、程式的流程結構

程式的流程控制結構共有三種:順序結構,選擇結構,循環結構。

  • 順序結構:從上向下,逐行執行。
  • 選擇結構:條件滿足,某些代碼才會執行。0-1次

    分支語句:if,switch,select

  • 循環結構:條件滿足,某些代碼會被反複的執行多次。0-N次

    ​循環語句:for

二、條件語句

1.if語句

三種文法格式:

  • 第一種:
if 布爾表達式 {
   /* 在布爾表達式為 true 時執行 */
}
           
  • 第二種:
if 布爾表達式 {
   /* 在布爾表達式為 true 時執行 */
} else {
  /* 在布爾表達式為 false 時執行 */
}
           
  • 第三種:
if 布爾表達式1 {
   /* 在布爾表達式1為 true 時執行 */
} else if 布爾表達式2{
   /* 在布爾表達式1為 false ,布爾表達式2為true時執行 */
} else{
   /* 在上面兩個布爾表達式都為false時,執行*/
}
           

示例代碼:

package main

import "fmt"

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

2.if變體語句

如果其中包含一個可選的語句元件(在評估條件之前執行),則還有一個變體。

它的文法是:

if statement; condition {  
		...
}

if condition{
    ...    
}
           

示例代碼:

package main

import (  
    "fmt"
)

func main() {  
    if num := 10; num % 2 == 0 { //checks if number is even
        fmt.Println(num,"is even") 
    }  else {
        fmt.Println(num,"is odd")
    }
}

需要注意的是: num的定義在if裡,那麼隻能夠在該if..else語句塊中使用,否則編譯器會報錯的。
           

3.switch語句 ( 開關語句 )

什麼是switch語句?

1.switch是一個條件語句,

它計算表達式并将其與可能比對的清單進行比較,并根據比對執行代碼塊。

2.switch 語句用于基于不同條件執行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到比對為止。

3.switch 語句執行的過程從上至下,直到找到比對項,比對項後面也不需要再加break。

4.而如果switch沒有表達式,它會預設比對true

5.Go裡面switch預設相當于每個case最後帶有break,比對成功後不會自動向下執行其他case,而是跳出整個switch, 但是可以使用fallthrough強制執行後面的case代碼。

6.變量 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被局限于常量或整數,但必須是相同的類型;或者最終結果為相同類型的表達式。

7.您可以同時測試多個可能符合條件的值,使用逗号分割它們,例如:case val1, val2, val3。

switch var1 {
    case val1:
        ...
    case val2:
        ...
    case val3,val4:
    	...
    default:
        ...
}
           

switch語句的文法格式:

1.switch文法格式:
	switch 變量{
		case 數值1:分支1
		case 數值2:分支2
		...
		default:
			最後一個分支
	}		

2.省略switch後的變量,相當于直接作用在true上
	switch{//true
	case true:
	case false:
	}

3.case後可以同時跟随多個數值
	switch 變量{
	case 數值1,數值2,數值3:
	case 數值4,數值5:
	}

4.switch後可以多一條初始化語句
	switch 初始化語句;變量{
	}
           

示例代碼:

package main

import "fmt"

func main() {
   /* 定義局部變量 */
   // 定義在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"  //case 後可以由多個數值
      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 );      
}
           
注意事項
switch可以作用在其他類型上,case後的數值必須和switch作用的變量類型一緻
case是無序的
case後的數值是唯一的(duplicate case 3 in switch)
default語句是可選的操作
           

4.fallthrough

如需貫通後續的case,就添加fallthrough

解釋:因為每個case自帶break語句,是以如果在執行完一個case語句後,還想執行後面case的語句,就需要使用fallthrouth
           

示例代碼:

package main

import (
	"fmt"
)

type data [2]int

func main() {
	switch x := 5; x {
	default:
		fmt.Println(x)
	case 5:
		x += 10
		fmt.Println(x)
		fallthrough
	case 6:
		x += 20
		fmt.Println(x)
	}
}

執行結果:
15
35
           

注意事項:

switch的注意事項

  1. case後的常量值不能重複
  2. case後可以有多個常量值
  3. fallthrough應該是某個case的最後一行。如果它出現在中間的某個地方,編譯器就會抛出錯誤。

5.Type Switch

switch 語句還可以被用于 type-switch 來判斷某個 interface 變量中實際存儲的變量類型。

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>
           

繼續閱讀