變參
接受不定數量參數的函數稱為變參函數,定義格式如下:
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
}