能夠把函數賦值給變量,能夠把函數做爲其餘函數的參數或者返回值,就是Go中頭等函數的機制。閉包
Func main(){ a := func(){ print } a() }
a函數沒有名稱,這類函數稱爲匿名函數。函數
經過如下語法自定義函數類型:code
type add func(a int ,b int) int
使用:匿名函數
Func main(){ var a add = func(a int, b int) int{ return a + b } s := a(5, 6) print s }
將自定義函數類型賦值給a,以後能夠調用a。變量
高階函數知足下列之必定義:語法
Func simple(a func(a, b int) int){ print a(60, 7) } Func main(){ f := func (a, b int) int{ return a + b } simple(f) }
func fimple() func(a, b int) int{ f := func(a, b int) int{ return a +b } return f } func main(){ s := simple() print s(60, 7) }
閉包是匿名函數一個特例,當一個匿名函數所訪問的變量定義在函數體外部時,這樣的匿名函數稱爲閉包。方法
func main(){ a := 5 func() { print a }() }
上面例子中在匿名函數中訪問了變量a,a存在匿名函數外部,這個匿名函數就是閉包。im
每一個閉包都會綁定一個它本身的外圍變量。co
含有defer語句的函數,會在方法返回以前,調用defer修飾的函數。return
func finished(){ print 111 } func largest(){ defer finished() print 222 } 執行結果爲:222,111
Largest方法開始執行,在largest方法返回以前會調用defer修飾的finished方法。
延遲函數的參數求值是在主函數順序執行到defer語句的時候,而不是延遲函數執行的時候。