Go語(yǔ)言從入門(mén)到精通-02 | 函數(shù)和控制語(yǔ)句

請(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í)行的流程

沒(méi)有用的封面

函數(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ǔ)言的特性澜沟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市峡谊,隨后出現(xiàn)的幾起案子茫虽,更是在濱河造成了極大的恐慌刊苍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒析,死亡現(xiàn)場(chǎng)離奇詭異正什,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)号杏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)婴氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盾致,你說(shuō)我怎么就攤上這事主经。” “怎么了庭惜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵罩驻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我护赊,道長(zhǎng)惠遏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任骏啰,我火速辦了婚禮节吮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘判耕。我一直安慰自己课锌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布祈秕。 她就那樣靜靜地躺著渺贤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪请毛。 梳的紋絲不亂的頭發(fā)上志鞍,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音方仿,去河邊找鬼固棚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仙蚜,可吹牛的內(nèi)容都是我干的此洲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼委粉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呜师!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贾节,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汁汗,失蹤者是張志新(化名)和其女友劉穎衷畦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體知牌,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祈争,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了角寸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩混。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扁藕,靈堂內(nèi)的尸體忽然破棺而出墨吓,到底是詐尸還是另有隱情,我是刑警寧澤纹磺,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站亮曹,受9級(jí)特大地震影響橄杨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜照卦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一式矫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧役耕,春花似錦采转、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至框全,卻和暖如春察绷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背津辩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拆撼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喘沿。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓闸度,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚜印。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莺禁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354