14. switch 的條件寫(xiě)的有點(diǎn)靈活,不過(guò)風(fēng)格還是go的一貫風(fēng)格

switch是很容易理解的,先來(lái)個(gè)代碼,運(yùn)行起來(lái),看看你的操作系統(tǒng)是什么吧。

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        fmt.Printf("%s", os)
    }
}

runtime運(yùn)行時(shí)獲取當(dāng)前的操作系統(tǒng),使用GOOS。
還和if for之類(lèi)的習(xí)慣一樣,可以在前面聲明賦值變量。我們就在這里來(lái)獲取操作系統(tǒng)的信息了。

os := runtime.GOOS;

{ } 里的case比較容易理解。操作系統(tǒng)是 "darwin" 就打印"OS X.";操作系統(tǒng)是 "linux" 就打印"Linux";其他的都直接打印系統(tǒng)類(lèi)別。
我用的是windows 10,所以我的運(yùn)行結(jié)果是

Go runs on windows

在go語(yǔ)言的switch中除非以 fallthrough 語(yǔ)句結(jié)束,否則分支會(huì)自動(dòng)終止。
所以修改一下上面的代碼,再運(yùn)行一下

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    case "windows":
        fmt.Println("win")
        fallthrough
    default:
        fmt.Printf("%s", os)
    }
}

增加了當(dāng)前的系統(tǒng)的case選項(xiàng) "windows",還在這個(gè)分支使用了 fallghrough。
運(yùn)行的結(jié)果就有穿透的效果了。

Go runs on win
windows

如果你再注釋掉 fallthrough,或干脆刪除 fallthrough,再運(yùn)行,就會(huì)發(fā)現(xiàn),那個(gè)穿透的效果沒(méi)有了。

Go runs on win

好吧,我們?cè)侔?fallthrough找回來(lái),并且在下面再加上一個(gè) case 分支,看看效果。

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    case "windows":
        fmt.Println("win")
        fallthrough
    case "gdwing":
        fmt.Println("He He!!")
    default:
        fmt.Printf("%s", os)
    }
}

運(yùn)行結(jié)果是

Go runs on win
He He!!

又穿透了,哪怕 "gdwing" 并不是合適的選項(xiàng),也直接穿透運(yùn)行了這個(gè)分支。而且只穿透了 fallthrough 緊鄰的這一個(gè)分支。
現(xiàn)在,對(duì) fallthrough 算是弄明白了。
可以這樣總結(jié):
switch 的條件從上到下的執(zhí)行,當(dāng)匹配成功的時(shí)候停止。如果匹配成功的這個(gè)分支是以fallthrough結(jié)束的,那么下一個(gè)緊鄰的分支也會(huì)被執(zhí)行。

再寫(xiě)一個(gè)判斷距離周六還有多久的程序吧!

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("When is Saturday?")
    today := time.Now().Weekday()
    switch time.Saturday {
    case today + 0:
        fmt.Println("Today.")
    case today + 1:
        fmt.Println("Tommorrow.")
    case today + 2:
        fmt.Println("In two days")
    default:
        fmt.Println("Too far away.")
    }
}

運(yùn)行結(jié)果你自己試試看。有耐心的話(huà),每天運(yùn)行一次,看不同的運(yùn)行結(jié)果。愛(ài)動(dòng)手改才是工程師的常規(guī)表現(xiàn),試著改成一個(gè)星期內(nèi)的每一天,看看運(yùn)行結(jié)果。這樣,你就不用等一周了。 嘻嘻!

好了,現(xiàn)在講一下 swith 的沒(méi)有條件的用法。這其實(shí)相當(dāng)于 switch true 一樣。每一個(gè) case 選項(xiàng)都是 bool 表達(dá)式,值為 true 的分支就是被執(zhí)行的分支?;蛘邎?zhí)行 default 。

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    switch  {
    case t.Hour() > 12  &&  t.Hour() <= 17:
        fmt.Println("Morning was passed.")
    case t.Hour() > 17:
        fmt.Println("Afternoon was passed.")
    default:
        fmt.Println("Now too early.")

    }
}

運(yùn)行結(jié)果

Now too early.

好吧,我現(xiàn)在是凌晨,所以“太早了”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語(yǔ)句Switch 語(yǔ)句控制轉(zhuǎn)移語(yǔ)句 continu...
    寒橋閱讀 821評(píng)論 0 0
  • 控制流 Swift提供了各種控制流程語(yǔ)句。這些包括while循環(huán)多次執(zhí)行任務(wù); if,guard以及switch基...
    Fuuqiu閱讀 439評(píng)論 0 0
  • Swift 提供了類(lèi)似 C 語(yǔ)言的流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 784評(píng)論 1 1
  • Swift提供了多種控制流聲明。包括while循環(huán)來(lái)多次執(zhí)行一個(gè)任務(wù);if,guard和switch聲明來(lái)根據(jù)確定...
    BoomLee閱讀 2,078評(píng)論 0 3
  • 好久都沒(méi)有再拿起筆或者敲響鍵盤(pán)記錄心情了,都快忘記自己是一個(gè)感性的人了!不知道從什么時(shí)候開(kāi)始,我忘記了這個(gè)習(xí)慣,也...
    calfiy閱讀 209評(píng)論 0 0

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