1. 程式人生 > >Go語言聖經(中文版)讀書筆記(五)

Go語言聖經(中文版)讀書筆記(五)

5.函式

  1. 函式宣告
  2. 遞迴
  3. 多返回值
  4. 錯誤
  5. 函式值
  6. 匿名函式
  7. 可變引數
  8. Deferred函式
  9. Panic異常
  10. Recover捕獲異常

函式宣告

func name(parameter-list) (result-list) {
    body
}
//result-list中可以宣告返回值,這樣這個返回值會先被初始化。最後函式只要return就可以自動返回result-list的值。

遞迴:go的遞迴與其他語言一樣
下面是我自己寫的一個遞迴的小程式,求階乘

package main

import
"fmt" func main() { fmt.Println(Factorial(3)) } func Factorial(start int) int { if start > 1 { return Factorial(start-1) * start } else { return 1 } }

特別注意原文中這樣一句話:

Go語言使用可變棧,棧的大小按需增加(初始時很小)。這使得我們使用遞迴時不必考慮溢位和安全問題。

多返回值:
引數、返回值的命名最好是有意義的,這樣能讓我們在閱讀程式碼的時候能夠更快的知道意思。
如果返回值中某個值不被使用,可以將其分配給blank identifier:links, _ := findLinks(url)

,這個下劃線就相當於我接收了這個值,然會就不管了。

錯誤:錯誤不是異常,錯誤是我們在程式設計中可以預料的並且在程式中需要顯示處理的。Go使用控制流機制(如if和return)處理異常,這使得編碼人員能更多的關注錯誤處理。

錯誤處理策略:

  1. 向上傳播錯誤
  2. 重試(防止無限重試)
  3. 輸出錯誤資訊並結束程式(這個方法只在main函式中執行)。
  4. 有時,我們只需要輸出錯誤資訊就足夠了,不需要中斷程式的執行。我們可以通過log包提供函式
  5. 我們可以直接忽略掉錯誤。

匿名函式

擁有函式名的函式只能在包級語法塊中被宣告,通過函式字面量(function literal),我們可繞過這一限制,在任何表示式中表示一個函式值。

可變引數
在宣告可變引數函式時,需要在引數列表的最後一個引數型別之前加上省略符號“…”,這表示該函式會接收任意數量的該型別引數。

func sum(vals...int) int {
    total := 0
    for _, val := range vals {
        total += val
    }
    return total
}

values := []int{1, 2, 3, 4}
fmt.Println(sum(values...)) // "10"

Deferred函式
只需要在呼叫普通函式或方法前加上關鍵字defer,就完成了defer所需要的語法。當defer語句被執行時,跟在defer後面的函式會被延遲執行。直到包含該defer語句的函式執行完畢時,defer後的函式才會被執行,不論包含defer語句的函式是通過return正常結束,還是由於panic導致的異常結束。你可以在一個函式中執行多條defer語句,它們的執行順序與宣告順序相反。

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
}

Panic異常
Recover捕獲異常