Go筆記-Chap4 函數(shù)

4.1 定義

  • 無須前置聲明
  • 不支持命名嵌套定義
  • 不支持同名重載
  • 不支持默認參數(shù)
  • 支持不定長變參
  • 支持多返回值
  • 支持命名返回值
  • 支持匿名函數(shù)和閉包
  • 只能判斷nil女责,不能比較

函數(shù)屬于第一類對象皮假,指可在運行期創(chuàng)建,可用作函數(shù)參數(shù)或返回值,可存入變量的實體各淀。常見用法:匿名函數(shù)

4.2 參數(shù)

  • 形參:函數(shù)定義中的參數(shù)擎场,局部變量
  • 實參:函數(shù)調用時所傳遞的參數(shù),函數(shù)外部對象泥耀,可以使常量,變量蛔添,表達式或函數(shù)等

全都是值拷貝傳遞痰催,pass-by-value兜辞!

變參

變參本質上是一個切片,只能接收一到多個同類型參數(shù)夸溶,且必須放在列表尾部逸吵。

4.3 返回值

命名返回值

類似參數(shù),當做局部變量使用缝裁,最后由return隱式返回扫皱。
其實沒啥必要。

4.4 匿名函數(shù)

匿名函數(shù)指沒有定義名字符號的函數(shù)压语。
在函數(shù)內(nèi)部定義匿名函數(shù)啸罢,形成嵌套效果。
好處:將大函數(shù)分解成多個相對獨立的匿名函數(shù)塊胎食,用相對簡潔的調用完成邏輯流程扰才,以實現(xiàn)框架和細節(jié)的分離。

閉包

閉包closure是在其語法上下文中引用了自由變量的函數(shù)厕怜,或者說是函數(shù)和其引用環(huán)境的組合體衩匣。
有點類似,直接引用原環(huán)境變量的指針粥航。

package main

func test() []func() {
    var s []func()

    for i := 0; i < 2; i++ {
        s = append(s, func() {
            println(&i, i)
        })
    }
    return s
}

func main() {
    for _, f := range test() {
        f()
    }
}

輸出為:

0xc04204c000 2
0xc04204c000 2

即琅捏,閉包通過指針引用環(huán)境變量,可能會導致其生命周期延長递雀, 甚至被分配到堆內(nèi)存柄延。此外還延遲求值
上面的代碼中缀程,main執(zhí)行函數(shù)時搜吧,讀取的是環(huán)境變量i最后一次循環(huán)時的值。
解決方法是:每次用不同的環(huán)境變量杨凑,或傳參復制滤奈,讓各自閉包環(huán)境各不相同。

4.5 延遲調用

延遲調用注冊的是調用撩满,必須提供執(zhí)行所需參數(shù)蜒程,參數(shù)值在注冊時被復制并緩存起來,如對狀態(tài)敏感伺帘,可改用指針或閉包昭躺。

func main() {
    x, y := 1, 2
    defer func(a int) {
        println("defer x, y = ", a, y)
    }(x)
    x += 100
    y += 100
    println(x, y)
}

輸出

101 102
defer x, y =  1 102

多個延遲注冊按FILO,先進后出次序進行曼追。
編譯器通過插入額外指令來實現(xiàn)延遲調用執(zhí)行窍仰,return和panic都會終止當前流程,引發(fā)延遲調用礼殊。
return的順序:

  1. 完成對函數(shù)返回值的賦值
  2. call defer
  3. 匯編ret指令

誤用

循環(huán)時defer會等到main函數(shù)結束驹吮,可能浪費資源,解決方法:匿名函數(shù)

性能

延遲調用代價更高晶伦,包括注冊調用碟狞,額外的緩存開銷,相差幾倍婚陪,所以性能要求高的算法應避免defer

4.6 錯誤處理

標準庫將error定義為借口類型族沃,以便實現(xiàn)自定義錯誤類型

type error interface {
    Error() string
}

大量函數(shù)和方法返回error,代碼賊難看泌参,全是檢查語句脆淹,解決思路:

  1. 使用專門的檢查函數(shù)處理錯誤邏輯,簡化檢查代碼
  2. 不影響邏輯的情況下沽一,使用defer延后處理錯誤
  3. 不中斷邏輯的情況下盖溺,將錯誤作為內(nèi)部狀態(tài)保存,等最終“提交”時再處理

panic铣缠, recover

接近try/catch結構化異常

  • 連續(xù)調用panic烘嘱,只有最后一個會被recover捕獲。
  • 在延遲函數(shù)中panic蝗蛙,不會影響后續(xù)延遲調用執(zhí)行蝇庭,而在recover之后,可以重新panic并捕獲捡硅。
  • recover必須在延遲調用函數(shù)中執(zhí)行才能正常工作
func catch() {
    log.Println("catch:", recover())
}

func main() {
    defer catch()                //nil
    defer catch()                //成功
    defer log.Println(recover()) //失敗
    defer recover()              //失斚凇!

    panic("i am dead")
}

輸出

2019/05/08 10:54:30 <nil>
2019/05/08 10:54:30 catch: i am dead
2019/05/08 10:54:30 catch: <nil>

建議:除非是不可恢復性壮韭,導致系統(tǒng)無法正常工作的錯誤北发,否則不建議使用panic

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泰涂,隨后出現(xiàn)的幾起案子鲫竞,更是在濱河造成了極大的恐慌,老刑警劉巖逼蒙,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件从绘,死亡現(xiàn)場離奇詭異,居然都是意外死亡是牢,警方通過查閱死者的電腦和手機僵井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驳棱,“玉大人批什,你說我怎么就攤上這事∩缃粒” “怎么了驻债?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵乳规,是天一觀的道長。 經(jīng)常有香客問我合呐,道長暮的,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任淌实,我火速辦了婚禮冻辩,結果婚禮上,老公的妹妹穿的比我還像新娘拆祈。我一直安慰自己恨闪,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布放坏。 她就那樣靜靜地躺著咙咽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轻姿。 梳的紋絲不亂的頭發(fā)上犁珠,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音互亮,去河邊找鬼犁享。 笑死,一個胖子當著我的面吹牛豹休,可吹牛的內(nèi)容都是我干的炊昆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼威根,長吁一口氣:“原來是場噩夢啊……” “哼凤巨!你這毒婦竟也來了?” 一聲冷哼從身側響起洛搀,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤敢茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后留美,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彰檬,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年谎砾,在試婚紗的時候發(fā)現(xiàn)自己被綠了逢倍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡景图,死狀恐怖较雕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挚币,我是刑警寧澤亮蒋,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布扣典,位于F島的核電站,受9級特大地震影響宛蚓,放射性物質發(fā)生泄漏激捏。R本人自食惡果不足惜设塔,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一凄吏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰蛔,春花似錦痕钢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至例诀,卻和暖如春随抠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背繁涂。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工拱她, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扔罪。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓秉沼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親矿酵。 傳聞我的和親對象是個殘疾皇子唬复,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345