1. 程式人生 > >Go語言【第五篇】:Go條件語句

Go語言【第五篇】:Go條件語句

receive 多個 inter ima comm 每一個 描述 進行 基於

Go語言條件

條件語句需要開發者通過指定一個或多個條件,並通過測試條件是否為true來決定是否執行指定語句,並在條件為false的情況再執行另外的語句。下圖展示了程序語言中條件語句的結構:
技術分享圖片

Go語言提供了以下幾種條件判斷語句:

語句 描述
if語句 if語句由一個布爾表達式後緊跟一個或多個語句組成
if...else語句 if語句後可以使用可選的else語句,else語句中的表達式在布爾表達式為false時執行
if嵌套語句 可以在ifelse if語句中嵌入一個或多個ifelse if語句
switch語句 switch語句用於基於不同條件執行不同動作
select語句 select語句類似於switch語句,但是select會隨機執行一個可運行的case,如果沒有case可以運行,它將阻塞,直到有case可運行

Go語言if語句
if語句由布爾表達式後緊跟一個或多個語句組成,其語法如下:

if 布爾表達式 {
    /* 在布爾表達式為 true時執行 */
}

if在布爾表達式為true時,其後緊跟的語句塊執行,如果為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) }

以上代碼執行結果為:

a 小於 20
a 的值為:10

Go語言if...else語句
if語句後可以使用可選的else語句,else語句中的表達式在布爾表達式為false時執行,其語法為:

if 布爾表達式{
    /* 在布爾表達式為true時執行 */
}else {
    /* 在布爾表達式為false時執行 */
}

if在布爾表達式為true時,其後緊跟的語句塊執行,如果為false則執行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

Go語言if嵌套
可以在if或者else if語句中嵌套一個或者多個if或else if語句,其語法如下:

if 布爾表達式 1 {
    /* 在布爾表達式 1 為true時執行 */
    if 布爾表達式 2 {
    /* 在布爾表達式 2 為true時執行 */
    }
}

可以使用同樣的方式在if語句中嵌套else if ... else語句
實例代碼:

package main

import "fmt"

func main()  {
    /* 定義局部變量 */
    var a int = 100
    var b int = 200

    /* 判斷條件 */
    if a == 100 {
        /* if 條件語句為 true 執行 */
        if b == 200 {
            /* if 條件語句為 true 執行 */
            fmt.Printf("a 的值為100, b 的值為200\n")
        }
    }
    fmt.Printf("a 值為:%d\n", a)
    fmt.Printf("b 值為:%d\n", b)
}

以上代碼運行結果:

a 的值為100, b 的值為200
a 值為:100
b 值為:200

Go語言switch語句
switch語句用於基於不同條件執行不同動作,每一個case分支都是唯一的,從上至下逐一測試,直到匹配為止;switch語句執行的過程從上至下,直到找到匹配項,匹配項後面不需要添加break,其語法如下:

switch varl {
    case varl1:
        ...
    case val2:
        ...
    default:
        ...
}

變量varl可以是任何類型,而varl1和varl2則可以是同類型的任意值。類型不被局限於常量或整數,但必須時相同的類型,或者最終結果為相同類型的表達式。其流程如如下:
技術分享圖片

實例代碼:

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

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>

Go語言select語句
select是Go中的一個控制結構,類似於通信的switch語句,每個case必須是一個通信操作,要麽是發送要麽是接收。select隨機執行一個可運行的case,如果沒有case可運行,它將阻塞,直到有case可運行。一個默認的子句應該總是可運行的,其語法如下:

select {
    case communication clause:
        statement(s)
    case communication clause:
        statement(s)
    /* 可以定義任意數量的case */
    default:    // 可選
        statement(s)
}

以下描述了select語句的語法:

  • 每個case都必須是一個通信
  • 所有channel表達式都會被求值
  • 所有被發送的表達式都會被求值
  • 如果任意某個通信可以進行,他就執行,其他被忽略
  • 如果有多個case都可以運行,select會隨機公平地選出一個執行,其他不會執行
    否則:
    1.如果有default子句,則執行該局;
    2.如果沒有default子句,select將阻塞,直到某個通信可以運行;Go不會重新對channel或值進行求值;

代碼實例:

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

Go語言【第五篇】:Go條件語句