Go起步:7、流程式控制制

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

流程式控制制是改變程式運行順序的指令,可能是運行不同位置的指令,或是在二段(或多段)程式中選擇一個運行。程式設計語言的流程式控制制語句,用於設定計算執行的次序,建立程式的邏輯結構。可以說, 流程式控制制語句是整個程式的骨架。

條件陳述式

條件判斷是依指定變數或運算式的結果,決定後續啟動並執行程式,可以根據指定條件是否成立,決定後續的程式。
對於 Go條件陳述式,提供了兩種方式:

  1. 單一條件判斷:if-else,也可以組合多個if-else指令,進行較複雜的條件判斷。
  2. 多選一條件判斷:switch-case。

if else

Go的if語句由一個布林運算式後緊跟一個或多個語句組成。if 語句後可以使用可選的 else 語句, else 語句中的運算式在布林運算式為 false 時執行。
通常格式為:

if 布林運算式 {   /* 在布林運算式為 true 時執行 */} else {  /* 在布林運算式為 false 時執行 */}

其中,Go 的 if 語句運算式外無需小括弧 ( ) ,而大括弧 { } 則是必須的。同時 {必須緊跟在if語句,不可換行,否則編譯或報錯–missing condition in if statement。

如下代碼:

package mainimport "fmt"func main() {    /* 定義局部變數 */    a := 10    /* 使用 if 語句判斷布林運算式 */    if a < 20 {        /* 如果條件為 true 則執行以下語句 */        fmt.Printf("a 小於 20\n")    } else {        /* 如果條件為 false 則執行以下語句 */        fmt.Printf("a 不小於 20\n")    }    fmt.Printf("a 的值為 : %d\n", a)}


除此之外,Go的 if 或 else if 語句可以嵌入一個或多個 if 或 else if 語句。

package mainimport "fmt"func main() {    /* 定義局部變數 */    var a int = 100    var b int = 200    /* 判斷條件 */    if a == 50 {        fmt.Printf("a 值為: %d\n", a)    } else 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)}

if 的簡短語句

if 語句可以在條件運算式前執行一個簡單的語句。

package mainimport (    "fmt"    "math")func pow(x, n, lim float64) {    if v := math.Pow(x, n); v < lim {        fmt.Printf("1.math.Pow(%f, %f):%f \n", x, n, v)    } else {        fmt.Printf("2.math.Pow(%f, %f):%f \n", x, n, v)    }    fmt.Println(lim)}func main() {    pow(3, 2, 10)    pow(3, 3, 20)}


這裡在if判斷運算式之前定義了一個變數v並初始化賦值。需要說明的是該語句聲明的變數範圍僅在 if 之內

switch case

Go的switch和其他語言功能基本一致,都是用於基於不同條件執行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。
具體文法也有Go的特色:

  1. 首先匹配項後面也不需要再加break
  2. switch後面的運算式不是必須的
  3. case 裡可以寫運算式
  4. 單個case中,可以出現多個結果選項
  5. 左花括弧{必須與switch處於同一行。這點在Go裡很普遍
  6. 有一個特殊關鍵字fallthrough,若且唯若在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case

    一般情況,Go 程式設計語言中 switch 語句的文法如下:

switch var1 {    case val1:        ...    case val2:        ...    default:        ...}

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

package mainimport "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)}


上面第一個switch中,和其他常見語言中的文法上switch基本一致。在第二個中就比較具有Go的特色。switch後面沒有運算式,case語句也可以使用運算式來判斷

package mainimport "fmt"func main() {    /* 定義局部變數 */    var grade string = "B"    switch {    case grade == "A":        fmt.Printf("優秀!\n")        fallthrough    case grade == "B", grade == "C":        fmt.Printf("良好\n")        fallthrough    case grade == "D":        fmt.Printf("及格\n")    case grade == "F":        fmt.Printf("不及格\n")        fallthrough    default:        fmt.Printf("差\n")    }    fmt.Printf("你的等級是 %s\n", grade)}


可以看出,語句成立後,如果加了fallthrough,下一條case就會被執行。

迴圈語句

Go語言中的迴圈語句只支援for關鍵字,不支援while和do-while 結構,可是有些寫法卻可是實作類別似功能。關鍵字for的基本使用方法與C和C++中非常接近。
基本的 for 迴圈由三部分組成,它們用分號隔開:

  • 初始化語句:在第一次迭代前執行
  • 條件運算式:在每次迭代前求值
  • 後置語句:在每次迭代的結尾執行

基本形式

Go語言的for迴圈有3中形式

1、for init; condition; post { }

注意條件陳述式也是不需要()的。

package mainimport "fmt"func main() {    sum := 0    for i := 0; i <= 100; i++ {        sum += i    }    fmt.Println(sum)}


上面代碼實現了1加到100的運算。

2、for condition { }

這個實現的有些像 while ,只要條件成立就一直執行。

package mainimport "fmt"func main() {    var b int = 15    var a int = 10    for a < b {        a++        fmt.Printf("a 的值為: %d\n", a)    }}

3、for { }

這樣定義,實際上就是無限迴圈了。如果省略迴圈條件,該迴圈就不會結束。
對於for的條件,還可以使用range 格式可以對 slice、map、數組、字串等進行迭代迴圈。

for的range

for key, value := range oldMap {    newMap[key] = value}
package mainimport "fmt"func main() {    numbers := [6]int{1, 2, 3, 5}    for i, x := range numbers {        fmt.Printf("第 %d 位 x 的值 = %d\n", i, x)    }}

迴圈控制語句

GO 語言支援以下幾種迴圈控制語句:

  • break 語句 經常用於中斷當前 for 迴圈或跳出 switch 語句
package mainimport "fmt"func main() {    /* 定義局部變數 */    var a int = 10    /* for 迴圈 */    for a < 20 {        fmt.Printf("a 的值為 : %d\n", a)        a++        if a > 15 {            /* 使用 break 語句跳出迴圈 */            break        }    }}


- continue 語句 跳過當前迴圈的剩餘語句,然後繼續進行下一輪迴圈。

package mainimport "fmt"func main() {    /* 定義局部變數 */    var a int = 10    /* for 迴圈 */    for a < 20 {        if a == 15 {            /* 跳過此次迴圈 */            a = a + 1            continue        }        fmt.Printf("a 的值為 : %d\n", a)        a++    }}


可以看到,15沒有被打出來。
- goto 語句 將控制轉移到被標記的語句。也稱成為跳躍陳述式。
但是,在結構化程式設計中一般不主張使用goto語句, 以免造成程式流程的混亂,使理解和偵錯工具都產生困難。

package mainimport "fmt"func main() {    /* 定義局部變數 */    var a int = 10    /* 迴圈 */LOOP:    for a < 20 {        if a == 15 {            /* 跳過迭代 */            a = a + 1            goto LOOP        }        fmt.Printf("a的值為 : %d\n", a)        a++    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.