Go 函式 學習筆記

衣舞晨風發表於2017-08-12

函式function:

  • Go 函式 不支援 巢狀、過載和預設引數
    但支援以下特性:

    無需宣告原型、不定長度變參、多返回值、命名返回值引數
    匿名函式、閉包
    
  • 定義函式使用關鍵字 func,且左大括號不能另起一行

  • 函式也可以作為一種型別使用

defer

  • defer的執行方式類似其它語言中的解構函式,在函式體執行結束後按照呼叫順序的相反順序逐個執行,即使函式發生嚴重錯誤也會執行。
  • 支援匿名函式的呼叫
  • 常用於資源清理、檔案關閉、解鎖以及記錄時間等操作
  • 通過與匿名函式配合可在return之後修改函式計算結果
  • 如果函式體內某個變數作為defer時匿名函式的引數,則在定義defer
    時即已經獲得了拷貝,否則則是引用某個變數的地址
package main

import (
    "fmt"
)

func main() {
    defer fmt.Println(1111)
    defer fmt.Println(2222)
    // fmt.Println("-------------------")
    for i := 0; i < 3; i++ {
        defer fmt.Println(i)
    }
    // fmt.Println("-------------------")
    // 如果函式體內某個變數作為defer時匿名函式的引數,則在定義defer時即已經獲得了拷貝,否則則是引用某個變數的地址
    for i := 4; i < 7; i++ {
        defer f(i)
    }
    // fmt.Println("-------------------")
    for i := 7; i < 10; i++ { //閉包
        defer func() {
            fmt.Println(i)
        }()
    }
    // fmt.Println("-------------------")

}

func f(a int) {
    fmt.Println(a)
}

輸出結果:
這裡寫圖片描述

panic/recover

Go 沒有異常機制,但有 panic/recover 模式來處理錯誤
Panic 可以在任何地方引發,但recover只有在defer呼叫的函式中有效

package main

import (
    "fmt"
)

func main() {
    A()
    B()
    C()
}

func A() {
    fmt.Println("func A")
}

func B() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recover in b")
        }
    }()
    panic("panic in b")
}

func C() {
    fmt.Println("func C")
}

輸出結果:
這裡寫圖片描述

本文參考整理自:《Go 程式設計基礎》

個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章