1. 程式人生 > 實用技巧 >FuncClosure閉包函式

FuncClosure閉包函式

目錄

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
  1. Go閉包的小結:閉包基本上就是上邊的函式這樣,函式內部引用了變數,無非就是作用域的問題。

  2. 注意:注意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