您好,登錄后才能下訂單哦!
程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法
上面這個等式每一個初學(xué)編程的同學(xué)都從老師那里聽說過。它并不是什么嚴(yán)格的數(shù)據(jù)公式,它只是對一般程序的簡單認(rèn)知。數(shù)據(jù)結(jié)構(gòu)是內(nèi)存數(shù)據(jù)關(guān)系的靜態(tài)表示,算法是數(shù)據(jù)結(jié)構(gòu)從一個狀態(tài)變化到另一個狀態(tài)需要執(zhí)行的機(jī)器指令序列。數(shù)據(jù)結(jié)構(gòu)是靜態(tài)的,算法是動態(tài)的。數(shù)據(jù)結(jié)構(gòu)是狀態(tài),算法是狀態(tài)的變化。
上一節(jié)我們講的變量,它是數(shù)據(jù)結(jié)構(gòu)的最小單位,本節(jié)我們要講的分支與循環(huán),它是算法邏輯的最小單位。
Go 語言的分支循環(huán)語句選擇性較少,循環(huán)語句它只有 for 循環(huán),平時我們在其它語言用的 while 語句、do while 語句、loop 語句它是沒有的。分支語句只有 if 和 switch,也沒有三元操作符。
少并不是壞事,夠用就行。語法糖豐富了表面上選擇性多了功能強(qiáng)大了,但是也會增加代碼的理解成本,用戶需要掌握更多的知識才可以理解代碼,這會提高語言的學(xué)習(xí)門檻。一個經(jīng)驗豐富的編程老鳥總是會傾向于用最簡單的代碼來寫出易于理解的程序來,偏方竅門奇技淫巧那是初學(xué)者膜拜的對象。
下面我們使用 if else 語句編寫一個最大函數(shù) max 、最小函數(shù) min 和 正負(fù)符號函數(shù) sign。這個例子中我們要第一次引入用戶自定義的函數(shù)。
package main
import "fmt"
func main() {
fmt.Println(sign(max(min(24, 42), max(24, 42))))
}
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
如果是其它語言,這種最大最小函數(shù)我們一般會使用三元操作符 a>b?a:b 一條語句搞定,不過 Go 語言沒有三元操作符,這里只能使用 if 語句,這里有那么點讓人不爽。
我們還需要注意到 if else 語句的條件居然不需要括號擴(kuò)起來,有一種不穿上衣逛街的感覺。這個也是讀者們需要適應(yīng)的地方,不單是 if else 語句的條件不需要括號,for 循環(huán)的條件也不需要括號,習(xí)慣就好!
哪種語言沒有 switch 語句?我所知道的只有 Python 語言,在 Python 里面你需要編寫很多的 if else 分支語句來達(dá)到 switch 的效果。Go 語言提供了 switch 語句,下面我們使用 switch 語句來編寫一個簡單的評分函數(shù)。switch 有兩種匹配模式,一種是變量值匹配,一種是表達(dá)式匹配。
package main
import "fmt"
func main() {
fmt.Println(prize1(60))
fmt.Println(prize2(60))
}
// 值匹配
func prize1(score int) string {
switch score / 10 {
case 0, 1, 2, 3, 4, 5:
return "差"
case 6, 7:
return "及格"
case 8:
return "良"
default:
return "優(yōu)"
}
}
// 表達(dá)式匹配
func prize2(score int) string {
// 注意 switch 后面什么也沒有
switch {
case score < 60:
return "差"
case score < 80:
return "及格"
case score < 90:
return "良"
default:
return "優(yōu)"
}
}
switch 還支持特殊的類型匹配語法,這個我們要放到后續(xù)章節(jié)來講解。
Go 語言雖然沒有提供 while 和 do while 語句,不過這兩個語句都可以使用 for 循環(huán)的形式來模擬。我們平時使用 while 語句來寫死循環(huán) 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 什么條件也不帶的,相當(dāng)于 loop {} 語句。for 帶一個條件的相當(dāng)于 while 語句。for 帶三個語句的就是普通的 for 語句。
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println("hello world!")
}
}
Go 語言支持 continue 和 break 語句來控制循環(huán),這兩個語句和其它語言沒什么特殊的區(qū)別。除此之外 Go 語言還支持 goto 語句。計算機(jī)科學(xué)家迪杰斯特拉很討厭 goto 語句,他的那片廣為流傳的論文《Goto 有害》已經(jīng)家喻戶曉般地為人所知,可是他已經(jīng)去世這么多年了,很遺憾還是沒能阻擋 goto 語句死灰復(fù)燃般地繼續(xù)存在。
我們作為普通用戶平時還是盡量不要使用 goto 語句了,不論是誰來 review 你的代碼只要是看到了 goto 語句肯定會發(fā)發(fā)牢騷的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。