FuncClosure閉包函式
阿新 • • 發佈:2020-12-13
目錄
FuncClosure閉包函式
對於閉包,無論是哪個語言都有,這玩意給在玩js時候,給我的印象就是他的區域性變數不消失。那我們來看看大神的想法:
閉包就是能夠讀取其他函式內部變數的函式。例如在javascript中,只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解成“定義在一個函式內部的函式“。在本質上,閉包是將函式內部和函式外部連線起來的橋樑
首先我們實現一個簡單的閉包
package closure import ( "fmt" ) func ClosureBase() func(x1 int, x2 int) int { i := 0 return func(x1 int, x2 int) int { i++ fmt.Println("此時閉包裡面的i的值:", i) sum := i + x1 + x2 return sum } }
隨後,我們進行函式測試
package closure import ( "fmt" "testing" ) func TestClosureBase(t *testing.T) { fmt.Println("---------f1函式測試-----------------") f1 := ClosureBase() fmt.Println(f1(1, 1)) fmt.Println(f1(1, 1)) fmt.Println(f1(1, 1)) fmt.Println("------------------f2函式測試---------------") f2 := ClosureBase() fmt.Println(f2(1, 1)) fmt.Println(f2(1, 1)) fmt.Println(f2(1, 1)) }
測試輸出
我是tmp
此時閉包裡面的i的值: 1
3
此時閉包裡面的i的值: 2
4
此時閉包裡面的i的值: 3
5
------------------f2函式測試---------------
我是tmp
此時閉包裡面的i的值: 1
3
此時閉包裡面的i的值: 2
4
此時閉包裡面的i的值: 3
5
-
Go閉包的小結:閉包基本上就是上邊的函式這樣,函式內部引用了變數,無非就是作用域的問題。
-
注意:注意tmp的輸出,你會發現函式第二次就不經過它了(尤其是這種邊緣化的細節,筆試就喜歡這些)
閉包應用
對於斐波那切數列,我們總是用遞迴玩,下面我們就用閉包看看如何
菲波那切數列實現
程式碼實現
package closure
import "fmt"
func Fbi() func() int {
fmt.Println("函式經過跑下面這倆了嗎")
b0 := 0
b1 := 1
return func() int {
tmp := b0 + b1
b0 = b1
b1 = tmp
return b1
}
}
測試程式碼
func TestFbi(t *testing.T) {
fmt.Println("斐波那切數列,非遞迴")
f := Fbi()
for i := 1; i <= 4; i++ {
fmt.Println(f())
}
}
輸出結果
斐波那切數列,非遞迴
函式經過跑下面這倆了嗎
1
2
3
5