《Go語言圣經(jīng)》第五章 函數(shù) 筆記

函數(shù)聲明

func name(parameter-list) (result-list) {
  body
}

遞歸

菲波那契數(shù)列示例:

func fib(x int) int {
  if x < 2 {
  return x
  }
  return fib(x-1) + fib(x-2)
}

多返回值

兩個值交換妓美,很方便。

i, j = j, i

錯誤

對于那些將運行失敗看作是預(yù)期結(jié)果的函數(shù),它們會返回一個額外的返回值,通常是最后一個,來傳遞錯誤信息粗蔚。如果導(dǎo)致失敗的原因只有一個,額外的返回值可以是一個布爾值,通常被命名為 ok。比如,cache.Lookup 失敗的唯一原因是 key 不存在,那么代碼可以按照下面的方式組織:

value, ok := cache.Lookup(key)if !ok {
  // ...cache[key] does not exist...
}

通常,導(dǎo)致失敗的原因不止一種,尤其是對 I/O 操作而言,用戶需要了解更多的錯誤信息。因此,額外的返回值不再是簡單的布爾類型,而是 error 類型酗捌。
內(nèi)置的 error 是接口類型。我們將在第七章了解接口類型的含義,以及它對錯誤處理的影響∮空埽現(xiàn)在我們只需要明白 error 類型可能是 nil 或者 non-nil胖缤。nil 意味著函數(shù)運行成功,non-nil 表示失敗。對于 non-nil 的 error 類型,我們可以通過調(diào)用 error 的 Error 函數(shù)或者輸出函數(shù)獲得字符串類型的錯誤信息阀圾。

resp, err := http.Get(url)
if err != nil{
  fmt.Println(err)
  return nill, err
}

Deferred 函數(shù)

defer 語句經(jīng)常被用于處理成對的操作,如打開哪廓、關(guān)閉、連接初烘、斷開連接涡真、加鎖分俯、釋放鎖。通過 defer 機制,不論函數(shù)邏輯多復(fù)雜,都能保證在任何執(zhí)行路徑下,資源被釋放哆料。釋放資源的 defer 應(yīng)該直接跟在請求資源的語句后缸剪。

示例:

func title(url string) error {
  resp, err := http.Get(url)if err != nil {
  return err
}
defer resp.Body.Close()
ct := resp.Header.Get("Content-Type")
if ct != "text/html" && !strings.HasPrefix(ct,"text/html;") {
  return fmt.Errorf("%s has type %s, not text/html",url, ct)
}
doc, err := html.Parse(resp.Body)
if err != nil {
  return fmt.Errorf("parsing %s as HTML: %v", url,err)
}
// ...print doc's title element...
  return nil
}

有了defer,就不用在后續(xù)的return之前再去反復(fù)調(diào)用resp.Body.Close()了东亦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杏节,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子典阵,更是在濱河造成了極大的恐慌奋渔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮啊,死亡現(xiàn)場離奇詭異嫉鲸,居然都是意外死亡,警方通過查閱死者的電腦和手機歹啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門玄渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人染突,你說我怎么就攤上這事捻爷。” “怎么了份企?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵也榄,是天一觀的道長。 經(jīng)常有香客問我司志,道長甜紫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任骂远,我火速辦了婚禮囚霸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘激才。我一直安慰自己拓型,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布瘸恼。 她就那樣靜靜地躺著劣挫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪东帅。 梳的紋絲不亂的頭發(fā)上压固,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音靠闭,去河邊找鬼帐我。 笑死坎炼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拦键。 我是一名探鬼主播谣光,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矿咕!你這毒婦竟也來了抢肛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碳柱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熬芜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莲镣,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年涎拉,在試婚紗的時候發(fā)現(xiàn)自己被綠了瑞侮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鼓拧,死狀恐怖半火,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情季俩,我是刑警寧澤钮糖,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站酌住,受9級特大地震影響店归,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪我,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一消痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧都哭,春花似錦秩伞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汇陆,卻和暖如春怒炸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毡代。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工阅羹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勺疼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓捏鱼,卻偏偏與公主長得像执庐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子导梆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 基礎(chǔ)部分(The Basics) 當(dāng)推斷浮點數(shù)的類型時轨淌,Swift 總是會選擇Double而不是Float。 結(jié)合...
    gamper閱讀 1,272評論 0 7
  • 常量與變量使用let來聲明常量看尼,使用var來聲明變量递鹉。聲明的同時賦值的話,編譯器會自動推斷類型藏斩。值永遠不會被隱式轉(zhuǎn)...
    莫_名閱讀 439評論 0 1
  • 本章將會介紹 自動引用計數(shù)的工作機制自動引用計數(shù)實踐類實例之間的循環(huán)強引用解決實例之間的循環(huán)強引用閉包引起的循環(huán)強...
    寒橋閱讀 896評論 0 0
  • 1、范型范型所解決的問題 函數(shù)兆览、方法屈溉、類型:類,結(jié)構(gòu)體抬探,枚舉子巾,元組類型,協(xié)議參數(shù)驶睦,返回值砰左,成員函數(shù)參數(shù),成員屬性類...
    我是小胡胡分胡閱讀 819評論 0 1
  • 132.轉(zhuǎn)換錯誤成可選值 通過轉(zhuǎn)換錯誤成一個可選值,你可以使用 try? 來處理錯誤场航。當(dāng)執(zhí)行try?表達式時,如果...
    無灃閱讀 1,244評論 0 3