人妻丰满熟妇AV无码片,岛国AV无码免费无禁网站,丰满岳乱妇一区二区三区,男插女高潮一区二区

golang 的 匿名函數(shù)與閉包

技術(shù)分享 2019-10-01 00:00:00
匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,它并不是一個新概念,最早可以回溯
到1958年的Lisp語言。但是由于各種原因,C和C++一直都沒有對匿名函數(shù)給以支持,其他的各
種語言,比如JavaScript、C#和Objective-C等語言都提供了匿名函數(shù)特性,當(dāng)然也包含Go語言。
1. 匿名函數(shù)
在Go里面,函數(shù)可以像普通變量一樣被傳遞或使用,這與C語言的回調(diào)函數(shù)比較類似。不同
的是,Go語言支持隨時在代碼里定義匿名函數(shù)。
匿名函數(shù)由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,如下所示:
func(a, b int, z float64) bool {
return a*b }
匿名函數(shù)可以直接賦值給一個變量或者直接執(zhí)行:
f := func(x, y int) int {
return x + y
}
func(ch chan int) {
ch <- ACK
} (reply_chan) // 花括號后直接跟參數(shù)列表表示函數(shù)調(diào)用




2. 閉包
Go的匿名函數(shù)是一個閉包,下面我們先來了解一下閉包的概念、價值和應(yīng)用場景。
? 基本概念
閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內(nèi)或者
任何全局上下文中定義,而是在定義代碼塊的環(huán)境中定義。要執(zhí)行的代碼塊(由于自由變量包含
在代碼塊中,所以這些自由變量以及它們引用的對象沒有被釋放)為自由變量提供綁定的計算環(huán)
境(作用域) 。
? 閉包的價值
閉包的價值在于可以作為函數(shù)對象或者匿名函數(shù),對于類型系統(tǒng)而言,這意味著不僅要表示
數(shù)據(jù)還要表示代碼。支持閉包的多數(shù)語言都將函數(shù)作為第一級對象,就是說這些函數(shù)可以存儲到
變量中作為參數(shù)傳遞給其他函數(shù),最重要的是能夠被函數(shù)動態(tài)創(chuàng)建和返回。
? Go語言中的閉包
Go語言中的閉包同樣也會引用到函數(shù)外的變量。閉包的實現(xiàn)確保只要閉包還被使用,那么
被閉包引用的變量會一直存在,如代碼清單2-5所示。


package main

import (
"fmt"
)

func main() {
var j int = 5
a := func() func() {
var i int = 10
return func() {
fmt.Printf("i, j: %d, %d\n", i, j)
}
}()
a()
j *= 2
a()
}




上述例子的執(zhí)行結(jié)果是:
i, j: 10, 5
i, j: 10, 10
在上面的例子中,變量 a 指向的閉包函數(shù)引用了局部變量 i 和 j , i 的值被隔離,在閉包外不
能被修改,改變 j 的值以后,再次調(diào)用 a ,發(fā)現(xiàn)結(jié)果是修改過的值。
在變量 a 指向的閉包函數(shù)中, 只有內(nèi)部的匿名函數(shù)才能訪問變量 i , 而無法通過其他途徑訪問
到,因此保證了 i 的安全性。
咨詢小瓶科技
咨詢我們
頂部