首頁 > 後端開發 > Golang > 主體

golang閉包有什麼用

(*-*)浩
發布: 2019-12-27 14:16:55
原創
3736 人瀏覽過

golang閉包有什麼用

什麼是閉包?

Go 函數可以是一個閉包。閉包是一個函數值,它引用了函數體之外的變數。 (推薦學習:go

這個函數可以對這個引用的變數進行存取和賦值;換句話說這個函數被「綁定」在這個變量上。

我的不可靠的理解,一個閉包相當於一個類別的實例,函數體之外的變數相當於這個實例儲存的變數。

沒有閉包的時候,函數就是一次性買賣,函數執行完畢後就無法再更改函數中變數的值(應該是記憶體釋放了);

有了閉包後函數就成為了一個變數的值,只要變數沒被釋放,函數就會一直處於存活並獨享的狀態,因此可以後期更改函數中變數的值(因為這樣就不會被go給回收記憶體了,會一直緩存在那裡)。

閉包的主要意義

縮小變數作用域,減少對全域變數的污染。下面的累加如果用全域變數進行實現,全域變數容易被其他人污染。

同時,所有我要實作n個累加器,那麼每次都需要n個全域變數。

利用背包,每個產生的累加器myAdder1, myAdder2 := adder(), adder()有自己獨立的sum,sum可以看作為myAdder1.sum與myAdder2.sum。

利用背包可以實現有自身狀態的函數!

package main

import (
	"fmt"
)

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	myAdder := adder()
	
	// 从1加到10
	for i := 1; i <= 10; i++ {
		myAdder(i)
	}
	
	fmt.Println(myAdder(0))
	// 再加上45
	fmt.Println(myAdder(45))
}
登入後複製

結果:

55// 1+...+10
100
登入後複製

以上是golang閉包有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板