匿名函數: 沒有函數名的函數
基本概念
閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者
任何全局上下文中定義,而是在定義代碼塊的環(huán)境中定義。要執(zhí)行的代碼塊(由于自由變量包含
在代碼塊中,所以這些自由變量以及它們引用的對象沒有被釋放)為自由變量提供綁定的計算環(huán)
境(作用域)。
閉包的價值
閉包的價值在于可以作為函數對象或者匿名函數,對于類型系統(tǒng)而言,這意味著不僅要表示
數據還要表示代碼。支持閉包的多數語言都將函數作為第一級對象,就是說這些函數可以存儲到
變量中作為參數傳遞給其他函數,最重要的是能夠被函數動態(tài)創(chuàng)建和返回。
創(chuàng)新互聯(lián)建站專注于西鄉(xiāng)塘企業(yè)網站建設,響應式網站開發(fā),商城網站開發(fā)。西鄉(xiāng)塘網站建設公司,為西鄉(xiāng)塘等地區(qū)提供建站服務。全流程按需求定制設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務
package main
import (
"fmt"
)
func main() {
a := 10
str := "make"
//匿名函數,沒有函數名字,函數定義,還沒有調用
f1 := func() {
fmt.Println("a=",a)
fmt.Println("str=",str)
}
f1()
// 給一個函數類型起別名
type FuncType func() // 函數沒有參數,沒有返回值
// 聲明變量
var f2 FuncType
f2 = f1
f2()
//定義匿名函數,同時調用
func() {
fmt.Printf("a=%d,str=%s\n", a,str)
}() // 后面的()代表調用匿名函數
// 帶參數的匿名函數
f3 := func(i,j int) {
fmt.Printf("i =%d, j=%d\n",i,j)
}
f3(1,2)
//定義匿名函數,同時調用
func(i, j int) {
fmt.Printf("i=%d,j=%d\n", a,j)
}(10,20) // 后面的()代表調用匿名函數
//匿名函數,有參數有返回值
x,y := func(i, j int) (max, min int){
if i > j{
return i,j
}else {
return j,i
}
}(10,20)
fmt.Println(x,y)
}
package main
import "fmt"
func test01() func() int {
var x int // 沒有初始化, 值為0
return func() int {
x++
return x * x
}
}
func test02() int {
var x int
x++
return x *x
}
func main() {
// 返回值為一個匿名函數,返回一個函數類型,通過f來調用返回的匿名函數
// 它不關心這些捕獲了的變量和常量是否超出了作用域
// 所以只要閉包還在使用它,這些變量就還會存在
f := test01()
fmt.Println(f()) //1
fmt.Println(f()) //4
fmt.Println(f()) //9
fmt.Println(f()) //16
// 用完就釋放了,每次調用還是1
fmt.Println(test02())
fmt.Println(test02())
fmt.Println(test02())
}
當前文章:Go匿名函數與閉包的使用
文章起源:http://muchs.cn/article38/pjjpsp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供移動網站建設、定制網站、品牌網站制作、建站公司、網站導航、做網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)