函數(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()
了东亦。