請(qǐng)從github下載配套代碼: https://github.com/shuningzhang/learn_golang
電子書(shū)下載地址: https://u19702000.ctfile.com/dir/19702000-33357795-bb2f31/
前文的內(nèi)容都是一大坨堆到那的祟剔,看上去很難看馅闽。下面我們介紹一下如何通過(guò)函數(shù)對(duì)代碼進(jìn)行封裝颓帝,同時(shí)會(huì)介紹如何通過(guò)控制語(yǔ)句改變程序執(zhí)行的流程。
函數(shù)
比如我們要實(shí)現(xiàn)某個(gè)功能痴鳄,舉個(gè)簡(jiǎn)答的例子,實(shí)現(xiàn)一個(gè)整數(shù)加法的功能。實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,代碼大概如下:
var add_1, add_2, add_3 int32
add_1 = 15
add_2 = 16
add_3 = add_1 + add_2
如果我們要在其它地方用這個(gè)功能呢拂共?沒(méi)別的辦法,只能講這個(gè)代碼重新寫(xiě)一遍蟹倾。如果用的地方很多,那就要寫(xiě)很多遍。這個(gè)時(shí)候函數(shù)出場(chǎng)了鲜棠,函數(shù)是做什么的呢肌厨?它可以將一段功能代碼封裝起來(lái),通過(guò)一個(gè)名字進(jìn)行使用豁陆。就好像說(shuō)柑爸,小張,過(guò)來(lái)幫我算一下1+1等于幾盒音。于是上面代碼可以變成下面這樣:
func int_add (a, b int32) int32 {
return a + b
}
然后表鳍,我們可以使用該函數(shù)了,下面完整的函數(shù)定義和調(diào)用的源代碼祥诽。
package main
import "fmt"
/* 這里是函數(shù)的定義譬圣,其中a, b 是函數(shù)的參數(shù)
* int32是參數(shù)類(lèi)型,)和{中間的int32是返
* 回值的類(lèi)型雄坪。
* 本函數(shù)實(shí)現(xiàn)2個(gè)32位整數(shù)的加法厘熟,并返回結(jié)果*/
func int_add (a, b int32) int32 {
var result int32
result = a + b
return result
}
func main() {
/* 這里是函數(shù)的調(diào)用,通過(guò)函數(shù)的名字進(jìn)行
* 調(diào)用维哈, 而后面跟著括弧绳姨,括弧中是參數(shù)。*/
fmt.Println( int_add(2, 3) )
}
通過(guò)上面代碼可以看出來(lái)阔挠,封裝功能之后飘庄,我們可以在其它地方使用,并且用起來(lái)非常簡(jiǎn)單和方便购撼。
函數(shù)的定義
上面給出了一個(gè)函數(shù)定義和使用的示例跪削,下面我們?cè)诰唧w看一下函數(shù)應(yīng)該如何定義。具體如下:
func function_name( [parameter list] ) [return_types] {
函數(shù)體
}
由上面示例可以看出函數(shù)由如下幾部分構(gòu)成:
關(guān)鍵字: func是函數(shù)的關(guān)鍵字份招,表示要定義一個(gè)函數(shù)
函數(shù)名稱(chēng): function_name是函數(shù)的名稱(chēng)切揭,命名約束跟變量一致
參數(shù)列表: 其中小括號(hào)是必須的,其中的參數(shù)列表( [parameter list] )是可選的锁摔,也就是可以沒(méi)有參數(shù)廓旬,也可以有多個(gè)參數(shù)。
返回值列表: 返回值列表[return_types]也是可選的谐腰。
函數(shù)開(kāi)始-結(jié)束標(biāo)識(shí):函數(shù)以{開(kāi)始孕豹,以}結(jié)束,需要注意的是在Go語(yǔ)言中{必須要與函數(shù)名在同一行十气。
函數(shù)體:函數(shù)體是函數(shù)的具體實(shí)現(xiàn)
復(fù)雜函數(shù)的定義與使用
上面是一個(gè)簡(jiǎn)單的函數(shù)定義和使用励背,下面本文再詳細(xì)的介紹一下函數(shù)的使用,但也不能完全介紹完砸西。后續(xù)在使用的時(shí)候再深入介紹叶眉。
package main
import "fmt"
/* 這個(gè)函數(shù)接收2個(gè)參數(shù)址儒,返回2個(gè)結(jié)果,具體在
* 內(nèi)部打印接收的參數(shù)衅疙。這里定義了一個(gè)復(fù)雜一點(diǎn)
* 的函數(shù)莲趣。
* 1. 2個(gè)參數(shù)具有不同的類(lèi)型,分別是string和int32
* 2. 具有2個(gè)返回值饱溢,這一點(diǎn)是跟C或者Java不同的地方
* 3. 返回值的類(lèi)型也是不同的喧伞。*/
func print_info (st_name string, st_age int32) (string, int32) {
fmt.Println(st_name)
fmt.Println(st_age)
return st_name, st_age
}
func main() {
/* 這里是函數(shù)的調(diào)用 */
fmt.Println( print_info("sbbdtest", 21) )
}
條件語(yǔ)句
我們?cè)谇懊娴慕榻B中程序的執(zhí)行都是從上往下依次執(zhí)行的,但這個(gè)有時(shí)候是不能滿足我們的要求的绩郎。有的時(shí)候我們需要控制程序執(zhí)行的順序潘鲫,這個(gè)時(shí)候就需要用到控制語(yǔ)句了。
舉個(gè)例子肋杖,我們需要實(shí)現(xiàn)這樣一個(gè)功能溉仑,將成績(jī)的分?jǐn)?shù)轉(zhuǎn)換為“優(yōu)良中及格”等字符。那么這個(gè)時(shí)候純順序執(zhí)行幾乎是做不到的兽愤。下面我們看一個(gè)例子彼念。
package main
import "fmt"
/* 函數(shù)內(nèi)部是一個(gè)條件判斷,也就是根據(jù)不同的
* 條件浅萧,會(huì)執(zhí)行不同的流程逐沙。條件內(nèi)部是一個(gè)邏輯
* 運(yùn)算,邏輯運(yùn)算在前面介紹過(guò)洼畅。
* 不同的輸入值吩案,在滿足條件的情況下才會(huì)執(zhí)行
* 響應(yīng)的代碼,代碼并不會(huì)全部執(zhí)行帝簇。*/
func trans_score (score uint8) (string) {
var level string
/* 這里是條件判斷徘郭,if是關(guān)鍵字,后面跟的是
* 判斷的條件丧肴,只有條件滿足的情況下才會(huì)執(zhí)行
* 其內(nèi)部的代碼邏輯残揉,也就是 level = "優(yōu)"
* 在條件判斷的后面也是跟著一對(duì){},這個(gè)表示
* 執(zhí)行體芋浮,與函數(shù)類(lèi)似抱环。*/
if ( score >= 90 ) {
level = "優(yōu)"
/* 這個(gè)是條件判斷的另外一種形式,只能跟在if
* 后面纸巷,在if不滿足條件的情況下會(huì)執(zhí)行到這里镇草。
* 如果if已經(jīng)滿足條件,則會(huì)跳過(guò)這里瘤旨。下面的
* 都是這樣梯啤。 */
} else if ( score >= 80 ) {
level = "良"
/* 判斷條件不一定非要(),下面示例是沒(méi)有的情況,
* 這一點(diǎn)與C和Java非常不同存哲。 */
} else if score >= 70 {
level = "中"
/* 大家可能注意了因宇,這里上一個(gè)判斷的結(jié)束符}與
* 本次判斷的開(kāi)始符{在同一行七婴,這個(gè)在Go中是必
* 須的,具體原因后續(xù)再詳述察滑。 */
} else if score >= 60 {
level = "及格"
} else {
level = "不及格"
}
return level
}
func main() {
/* 這里是函數(shù)的調(diào)用 */
fmt.Println( trans_score(88) )
}
循環(huán)語(yǔ)句
條件語(yǔ)句用于執(zhí)行不同條件的代碼本姥,而有的時(shí)候我們需要不斷循環(huán)執(zhí)行某個(gè)代碼片段。這個(gè)時(shí)候就用到了循環(huán)語(yǔ)句杭棵。循環(huán)語(yǔ)句用于進(jìn)行重復(fù)的操作。我們看下面的例子氛赐,這個(gè)例子中我們用于計(jì)算累加和魂爪,比如計(jì)算從1到10的和,或者從1到100的和艰管。如果沒(méi)有循環(huán)語(yǔ)句滓侍,前者可能最少要寫(xiě)10行代碼,而后者可能最少要寫(xiě)100行代碼才行牲芋。我們看一下示例:
package main
import "fmt"
/* 這個(gè)函數(shù)用于計(jì)算從1到end的累加和撩笆,參數(shù)
* end是數(shù)據(jù)的最后一個(gè)值。 */
func calc_sum (end uint32) (uint32) {
var begin, result uint32
result = 0
/* 這里是循環(huán)缸浦,其中{}分別是循環(huán)體的開(kāi)始和
* 結(jié)束夕冲,與函數(shù)和條件判斷類(lèi)似。
* for是關(guān)鍵字裂逐,表示循環(huán)歹鱼;關(guān)鍵字和循環(huán)體中間
* 分為3部分:
* begin = 0 在循環(huán)開(kāi)始執(zhí)行,只執(zhí)行一次
* begin < end 是條件判斷卜高,滿足的情況下
* 才會(huì)執(zhí)行循環(huán)體中的內(nèi)容弥姻。
* begin ++每次執(zhí)行完循環(huán)體中的內(nèi)容后執(zhí)行*/
for begin = 0; begin <= end; begin ++ {
result += begin //這里是循環(huán)體
}
return result
}
/* 這個(gè)函數(shù)的功能與上面一個(gè)一致 */
func calc_sum_ex (end uint32) (uint32) {
var begin, result uint32
result = 0
/* 上一個(gè)函數(shù)中所說(shuō)的3部分并不是強(qiáng)制的,可以
* 只有一部分掺涛,也就是條件判斷庭敦。這個(gè)時(shí)候其實(shí)
* 退化成了C或者Java中的while語(yǔ)句。 */
for begin <= end {
result += begin //這里是循環(huán)體
begin ++
}
return result
}
func main() {
/* 這里是函數(shù)的調(diào)用 */
fmt.Println( calc_sum_ex(5) )
}
其實(shí)for后面的條件判斷也是可以沒(méi)有的薪缆,不過(guò)這個(gè)時(shí)候就變成了死循環(huán)秧廉,在實(shí)際情況中一般不會(huì)這么使用。
好了矮燎,今天給大家介紹了函數(shù)定血,條件語(yǔ)句和循環(huán)語(yǔ)句。到這里大家可以通過(guò)Go語(yǔ)言寫(xiě)很多程序了诞外。后面本號(hào)再給大家深入的介紹Go語(yǔ)言的特性澜沟。