《快學 Go 語言》第 3 課 —— 分支與迴圈

碼洞發表於2018-11-21

程式 = 資料結構 + 演算法

上面這個等式每一個初學程式設計的同學都從老師那裡聽說過。它並不是什麼嚴格的資料公式,它只是對一般程式的簡單認知。資料結構是記憶體資料關係的靜態表示,演算法是資料結構從一個狀態變化到另一個狀態需要執行的機器指令序列。資料結構是靜態的,演算法是動態的。資料結構是狀態,演算法是狀態的變化。

《快學 Go 語言》第 3 課 —— 分支與迴圈

上一節我們講的變數,它是資料結構的最小單位,本節我們要講的分支與迴圈,它是演算法邏輯的最小單位。

Go 語言的分支迴圈語句選擇性較少,迴圈語句它只有 for 迴圈,平時我們在其它語言用的 while 語句、do while 語句、loop 語句它是沒有的。分支語句只有 if 和 switch,也沒有三元運算子。

少並不是壞事,夠用就行。語法糖豐富了表面上選擇性多了功能強大了,但是也會增加程式碼的理解成本,使用者需要掌握更多的知識才可以理解程式碼,這會提高語言的學習門檻。一個經驗豐富的程式設計老鳥總是會傾向於用最簡單的程式碼來寫出易於理解的程式來,偏方竅門奇技淫巧那是初學者膜拜的物件。

if else 語句

下面我們使用 if else 語句編寫一個最大函式 max 、最小函式 min 和 正負符號函式 sign。這個例子中我們要第一次引入使用者自定義的函式。

package main

import "fmt"

func main() {
    fmt.Println(sign(max(min(2442), max(2442))))
}

func max(a int, b int) int {
    if a > b {
        return a
    }
    return b
}

func min(a int, b int) int {
    if a < b {
        return a
    }
    return b
}

func sign(a int) int {
    if a > 0 {
        return 1
    } else if a < 0 {
        return -1
    } else {
        return 0
    }
}

------------
1


如果是其它語言,這種最大最小函式我們一般會使用三元運算子 a>b?a:b 一條語句搞定,不過 Go 語言沒有三元運算子,這裡只能使用 if 語句,這裡有那麼點讓人不爽。

我們還需要注意到 if else 語句的條件居然不需要括號擴起來,有一種不穿上衣逛街的感覺。這個也是讀者們需要適應的地方,不單是 if else 語句的條件不需要括號,for 迴圈的條件也不需要括號,習慣就好!

switch 語句

哪種語言沒有 switch 語句?我所知道的只有 Python 語言,在 Python 裡面你需要編寫很多的 if else 分支語句來達到 switch 的效果。Go 語言提供了 switch 語句,下面我們使用 switch 語句來編寫一個簡單的評分函式。switch 有兩種匹配模式,一種是變數值匹配,一種是表示式匹配。

package main

import "fmt"

func main() {
    fmt.Println(prize1(60))
    fmt.Println(prize2(60))
}

// 值匹配
func prize1(score int) string {
    switch score / 10 {
    case 012345:
        return "差"
    case 67:
        return "及格"
    case 8:
        return "良"
    default:
        return "優"
    }
}

// 表示式匹配
func prize2(score int) string {
   // 注意 switch 後面什麼也沒有
    switch {
        case score < 60:
            return "差"
        case score < 80:
            return "及格"
        case score < 90:
            return "良"
        default:
            return "優"
    }
}


switch 還支援特殊的型別匹配語法,這個我們要放到後續章節來講解。

for 迴圈

Go 語言雖然沒有提供 while 和 do while 語句,不過這兩個語句都可以使用 for 迴圈的形式來模擬。我們平時使用 while 語句來寫死迴圈 while(true) {},Go 語言可以這麼寫

package main

import "fmt"

func main() {
    for {
        fmt.Println("hello world!")
    }
}


也可以這樣寫,效果是一樣的

package main

import "fmt"

func main() {
    for true {
        fmt.Println("hello world!")
    }
}


for 什麼條件也不帶的,相當於 loop {} 語句。for 帶一個條件的相當於 while 語句。for 帶三個語句的就是普通的 for 語句。

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println("hello world!")
    }
}

for 語句配合 range 關鍵字還能玩出更多新花樣,這個我們會在後面章節陸續講解

迴圈控制

Go 語言支援 continue 和 break 語句來控制迴圈,這兩個語句和其它語言沒什麼特殊的區別。除此之外 Go 語言還支援 goto 語句。電腦科學家迪傑斯特拉很討厭 goto 語句,他的那片廣為流傳的論文《Goto 有害》已經家喻戶曉般地為人所知,可是他已經去世這麼多年了,很遺憾還是沒能阻擋 goto 語句死灰復燃般地繼續存在。

《快學 Go 語言》第 3 課 —— 分支與迴圈


我們作為普通使用者平時還是儘量不要使用 goto 語句了,不論是誰來 review 你的程式碼只要是看到了 goto 語句肯定會發發牢騷的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561269/viewspace-2220959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章