Go 專欄|流程控制,一網(wǎng)打盡

05_流程控制.png

原文鏈接: Go 專欄|流程控制,一網(wǎng)打盡

最近看奧運會看的我熱血沸騰,中國奧運健兒簡直太棒了,不只是成績,還有氣質(zhì),精氣神,全方位的棒。

而且這次奧運會我覺得最感動的是,看到一些年紀大的運動員拿了好成績:呂小軍 37 歲,馬龍 32,蘇炳添 32,鞏立姣 32 歲才拿了自己的第一塊奧運金牌。連這么受限于年齡的運動員都能不斷突破自己,何況我們呢?還每天在網(wǎng)上焦慮程序員 35 歲就要被優(yōu)化?

所以別給自己找年齡作為借口了,覺得年齡大了這不行那不行,干就完事了。

if-else

特點:

  • 條件語句不需要使用小括號 () 包起來;
  • 花括號 {} 必須有,并且左花括號 { 必須和 ifelse 在同一行;
  • if 之后,條件語句之前可以添加變量初始化語句,使用 ; 分隔。
package main

import "fmt"

func main() {
    if 7%2 == 0 {
        fmt.Println("7 is even")
    } else {
        fmt.Println("7 is odd") // 7 is odd
    }

    if 8%4 == 0 {
        fmt.Println("8 is divisible by 4") // 8 is divisible by 4
    }

    if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit") // 9 has 1 digit
    } else {
        fmt.Println(num, "has multiple digits")
    }
}

switch

特點:

  • 左花括號 { 必須和 switch 在同一行;
  • 條件表達式不限制常量或者整數(shù);
  • switch 后可添加變量初始化語句,使用 ; 分割;
  • 可以不設定條件表達式,在此種情況下,整個 switch 結(jié)構(gòu)與多個 if-else 的邏輯作用等同;
  • 單個 case 中可以出現(xiàn)多個結(jié)果選項;
  • case 中添加 fallthrough 關鍵字,會繼續(xù)執(zhí)行緊跟的下一個 case,不需要判斷 case 的條件語句;
  • switch 支持 default 語句,當所有 case 都不滿足時,執(zhí)行 default 語句。
package main

import (
    "fmt"
    "time"
)

func main() {
    i := 2
    fmt.Print("write ", i, " as ")
    switch i {
    case 1:
        fmt.Println("one")
    case 2:
        fmt.Println("two") // write 2 as two
        fallthrough
    case 3:
        fmt.Println("three") // three
    case 4, 5, 6:
        fmt.Println("four, five, six")
    }

    switch num := 9; num {
    case 1:
        fmt.Println("one")
    default:
        fmt.Println("nine") // nine
    }

    switch time.Now().Weekday() {
    case time.Saturday, time.Sunday:
        fmt.Println("it's the weekend")
    default:
        fmt.Println("it's a weekday") // it's a weekday
    }

    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("it's before noon")
    default:
        fmt.Println("it's after noon") // it's after noon
    }
}

for

特點:

  • 條件表達式不需要使用小括號 () 包起來;
  • 花括號 {} 必須有,并且左花括號 { 必須和 for 在同一行;
  • 支持 continuebreak。
package main

import (
    "fmt"
)

func main() {
    i := 1
    // 只有條件
    for i <= 3 {
        fmt.Println(i)
        i = i + 1
    }

    // 有變量初始化和條件
    for j := 7; j <= 9; j++ {
        fmt.Println(j)
    }

    // 死循環(huán)
    for {
        fmt.Println("loop")
        break
    }

    // 遍歷數(shù)組
    a := [...]int{10, 20, 30, 40}
    for i := range a {
        fmt.Println(i)
    }
    for i, v := range a {
        fmt.Println(i, v)
    }

    // 遍歷切片
    s := []string{"a", "b", "c"}
    for i := range s {
        fmt.Println(i)
    }
    for i, v := range s {
        fmt.Println(i, v)
    }

    // 遍歷字典
    m := map[string]int{"a": 10, "b": 20, "c": 30}
    for k := range m {
        fmt.Println(k)
    }
    for k, v := range m {
        fmt.Println(k, v)
    }
}

goto,break,continue

goto 特點:

  • 只能在函數(shù)內(nèi)跳轉(zhuǎn),需要配合標簽一起使用;
  • 不能跳過內(nèi)部變量聲明語句;
  • 只能跳到同級作用域或者上層作用域內(nèi),不能跳到內(nèi)部作用域內(nèi)。
package main

import (
    "fmt"
)

func main() {
    // 跳出循環(huán)
    for i := 0; ; i++ {
        if i == 2 {
            goto L1
        }
        fmt.Println(i)
    }
L1:
    fmt.Println("Done")

    // 跳過變量聲明,不允許
    //  goto L2
    //  j := 1
    // L2:
}

break 特點:

  • 單獨使用,用于跳出 break 當前所在的 for、 switchselect 語句的執(zhí)行;
  • 和標簽一起使用,用于跳出標簽所標識的 forswitch、 select 語句的執(zhí)行,可用于跳出多重循環(huán),但標簽和 break 必須在同一個函數(shù)內(nèi)。
package main

import (
    "fmt"
)

func main() {
    // break 跳轉(zhuǎn)到標簽處,然后跳過 for 循環(huán)
L3:
    for i := 0; ; i++ {
        for j := 0; ; j++ {
            if i >= 2 {
                break L3
            }
            if j > 4 {
                break
            }
            fmt.Println(i, j)
        }
    }
}

continue 特點:

  • 單獨使用,用于跳出 continue 當前所在的 for 循環(huán)的本次迭代;
  • 和標簽一起使用,用于跳出標簽所標識的 for 語句的本次選代,但標簽和 continue 必須在同一個函數(shù)內(nèi)。
package main

import (
    "fmt"
)

func main() {
    // continue 跳轉(zhuǎn)到標簽處,然后執(zhí)行 i++
L4:
    for i := 0; ; i++ {
        for j := 0; j < 6; j++ {
            if i > 4 {
                break L4
            }
            if i >= 2 {
                continue L4
            }
            if j > 4 {
                continue
            }
            fmt.Println(i, j)
        }
    }
}

總結(jié)

本文主要介紹了流程控制語句,分別是條件語句,選擇語句,循環(huán)語句和跳轉(zhuǎn)語句。

  • 條件語句: 對應關鍵詞 if,elseelse if
  • 選擇語句: 對應關鍵詞 switch,casefallthroughdefault;
  • 循環(huán)語句: 對應關鍵詞 forrange;
  • 跳轉(zhuǎn)語句: 對應關鍵詞 goto

除此之外,還有 breakcontinue,都可以搭配循環(huán)語句和跳轉(zhuǎn)語句使用。

跳轉(zhuǎn)語句在某些場景下會非常實用,但也很容易出現(xiàn)一些莫名其妙的問題,所以使用起來要更謹慎些。


文章中的腦圖和源碼都上傳到了 GitHub,有需要的同學可自行下載。

地址: https://github.com/yongxinz/gopher/tree/main/sc

關注公眾號 AlwaysBeta,回復「goebook」領取 Go 編程經(jīng)典書籍。

Go 專欄文章列表:

  1. Go 專欄|開發(fā)環(huán)境搭建以及開發(fā)工具 VS Code 配置
  2. Go 專欄|變量和常量的聲明與賦值
  3. Go 專欄|基礎數(shù)據(jù)類型:整數(shù)、浮點數(shù)、復數(shù)、布爾值和字符串
  4. Go 專欄|復合數(shù)據(jù)類型:數(shù)組和切片 slice
  5. Go 專欄|復合數(shù)據(jù)類型:字典 map 和 結(jié)構(gòu)體 struct
  6. Go 專欄|流程控制,一網(wǎng)打盡
  7. Go 專欄|函數(shù)那些事
  8. Go 專欄|錯誤處理:defer,panic 和 recover
  9. Go 專欄|說說方法
  10. Go 專欄|接口 interface
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 作者:李驍 14.1 Switch 語句 switch 語句的第二種形式是不提供任何被判斷的值(實際上默認為判斷是...
    ffhelicopter閱讀 1,274評論 0 5
  • 1.概述 代碼的執(zhí)行順序,有 3 大類,為: 順序,從上到下依次執(zhí)行,基礎流程(核心流程) 循環(huán),某段代碼重復執(zhí)行...
    如逆水行舟不進則退閱讀 429評論 0 1
  • Golang流程控制 Golang當中的流程控制ifif語句由一個布爾表達式后緊跟一個或多個語句組成Go變成語言種...
    TZX_0710閱讀 310評論 0 0
  • 1. 概述 程序中的流程控制語句,用于設置程序的執(zhí)行次序,體現(xiàn)程序執(zhí)行流程的實現(xiàn)部分,建立程序的基本邏輯結(jié)構(gòu). 2...
    楚江云閱讀 365評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,885評論 28 54

友情鏈接更多精彩內(nèi)容