頭等函數
可以把函數賦值給變量,可以把函數作爲其他函數的參數或者返回值,就是Go中頭等函數的機制。
Func main(){
a := func(){
print
}
a()
}
匿名函數
a函數沒有名稱,這類函數稱爲匿名函數。
自定義函數類型
通過以下語法自定義函數類型:
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存在匿名函數外部,這個匿名函數就是閉包。
每個閉包都會綁定一個它自己的外圍變量。
延遲函數(defer)
含有defer語句的函數,會在方法返回之前,調用defer修飾的函數。
func finished(){
print 111
}
func largest(){
defer finished()
print 222
}
執行結果爲:222,111
Largest方法開始執行,在largest方法返回之前會調用defer修飾的finished方法。
延遲函數的參數求值是在主函數順序執行到defer語句的時候,而不是延遲函數執行的時候。