1.匿名函數
匿名函數就是我們不想給函數起名字的時候就叫匿名函數,函數不能獨立存在的
```
run := func(x, y int) int { return x + y }
run(2,3)
```
可以賦予變量通過變量進行調用,即保存函數的地址到變量中,通過變量進行調用,也可以通過自己調用自己
```
func(x ,y int) int{
return x+y
}(2,3)
```
下如何將匿名函數賦值給變量并對其進行調用:
```
func main() {
f()
}
func f() {
for i := 0; i < 4; i++ {
g := func(i int) { fmt.Printf("%d ", i) }
g(i)
fmt.Printf(" g is of type %T and has value %v\n", g, g)
}
}
```
變量 g 代表的是 func(int),變量的值是一個內存地址。所以我們實際上擁有的是一個函數值:匿名函數可以被賦值給變量并作為值使用。
2.閉包函數
應用閉包函數作為函數的返回值
```
func main() {
p2 := Add2()
fmt.Println(p2(3))
p3 := Adder(2)
fmt.Println(p3(3))
}
// 聲明一個Add2()函數 此函數的返回值是一個閉包函數
// 函數的參數 返回值都可以函數
func Add2() func(b int) int {
return func(b int) int {
return b + 2
}
}
func Adder(a int) func(b int) int {
return func(b int) int {
return a + b
}
}
```
```
package main
import "fmt"
type function func(x , y int)interface{}
func main() {
res := RealFun(1,2,func(x int,y int)interface{}{
return x*y
})
fmt.Println(res)
}
func RealFun(x,y int,op function) interface{} { //
if op == nil {
return 0
}
return op(x,y)
}
```
一個簡單的小測試,以下程序會輸出什么呢???
```
func main() {
var f = Adder()
fmt.Println(f(1))
fmt.Println(f(10))
fmt.Println(f(100))
}
func Adder() func(int) int {
var x int
return func(arg int) int {
x += arg
return x
}
}
```
三次調用函數 f 的過程中函數 Adder() 中變量 arg的值分別為:1、10 和 100。
我們可以看到,在多次調用中,變量 x 的值是被保留的,即 0 + 1 = 1,然后 1 + 10 = 11,最后 11 + 100 = 111:閉包函數保存并積累其中的變量的值,不管外部函數退出與否,它都能夠繼續操作外部函數中的局部變量。
引出一個概念:什么試高階函數
1. 高階函數:可以返回其它函數的函數和接受其它函數作為參數的函數均被稱之為高階函數,是函數式語言的特點。
2. 函數簽名表示傳入與返回參數的類型與順序一致
3. 函數是一等公民(頭等函數)
4. 閉包函數:閉包函數保存并積累其中的變量的值,不管外部函數退出與否,它都能夠繼續操作外部函數中的局部變量