天天看點

Go語言學習筆記 -- 函數(2)

變參

接受不定數量參數的函數稱為變參函數,定義格式如下:

func myFunc(args … int){ }

args…int 告訴Go這個函數接受不定數量的參數。注意,這些參數的類型全是int,在函數體内,args是一個int型的slice

func sumInt(args ...int) int {
    sum :=
    for _, n := range args {
        sum += n
    }
    return sum
}
           

如果不指定變參的類型,預設是空的接口interface{},假設有另一個變參函數myFunc2,下面的例子示範如何想起傳遞參數:

func myFunc(args...int) {
    myFunc2(args...)     <--原樣傳遞
    myFunc2(args[]...)   <--傳遞部分
}
           

函數作為值

就像Go中的其他東西一樣,函數也是值而已。它可以像下面這樣指派給變量:

func main() {
    a := func() {
        println("print something")
    }  <-- 注意這裡沒有()

    a() <--調用函數
}
           

回調

因為函數可以指派給變量,是以可以作為參數傳遞到函數中,然後可以作為回調。比如有一個函數

func printit(x int) {
    println(x)
}
           

這個函數的辨別是 func printit(int)或者沒有函數名的func(int),建立新的函數,使用這個函數作為回調,需要用到這個辨別:

func myFunc(y int, f func(int)) {
    f(y)
}
           

恐慌(Panic)和恢複(Recover)

Go沒有像Java那樣的異常機制,例如你無法向Java中那樣抛出一個異常。作為替代,它使用了恐慌和恢複(Panic-and-Recover)機制。這應當作為最後的手段被指用,代碼中應當避免,或者盡量少的出現恐慌代碼。應當如何使用它:

panic

是一個内建函數可以中斷原有的控制流程,進入一個令人恐慌的流程中。當函數F調用panic函數F的執行被中斷,并且F中的延遲函數被執行,然後F傳回到調用它的地方。在調用它的地方,F的行為就像調用了一個panic,這一過程繼續向上,直到程式崩潰時的所有goroutine傳回。

Recover

是一個内建函數。可以讓令人恐慌的流程中的routine恢複過來。recover僅在延遲函數中有效,正常執行過程中,recover函數會傳回nil并且沒有其他任何效果。如果目前的goroutine陷入恐慌,調用recover可以獲得panic的輸入值,并且恢複正常執行。

下面這個函數檢查作為其參數的函數執行時是否會産生panic:

func throwPanic(f func()) (b bool) {
    def func(){
        if x:= recover && x != nil {
            b = true
        }
    }

    f()
    return 
}