1. 程式人生 > >GO基礎之閉包

GO基礎之閉包

一、閉包的理解

閉包是匿名函式與匿名函式所引用環境的組合。匿名函式有動態建立的特性,該特性使得匿名函式不用通過引數傳遞的方式,就可以直接引用外部的變數。

這就類似於常規函式直接使用全域性變數一樣,個人理解為:匿名函式和它引用的變數以及環境,類似常規函式引用全域性變數處於一個包的環境。

 

 

 

package main

import "fmt"

func main() {
    //第一種方式
    res := adder()
    fmt.Printf("%T \n", res)
    for i := 0; i < 5; i++ {
        fmt.Println("i=", i, "sum=", res(i))
    }

    res2 := adder2()
    fmt.Println("res2=", res2)
    fmt.Println("result=", res2())
    fmt.Printf("%T \n", res2)
    
    //第二種方式 匿名閉包
    res3 := func() func() int {
        num := 0
        return func() int {
            num++
            return num
        }
    }()
    fmt.Println("res3=", res2)
    fmt.Println("result=", res3())
}



//定義一個閉包函式 實現累加器
func adder() func(int) int {
    sum := 0
    res := func(num int) int {
        sum += num
        return sum
    }
    return res
}
//定義一個無參閉包函式 實現累加器
func adder2() func() int {
    sum := 0
    res := func() int {
        sum++
        return sum
    }
    fmt.Println("res=", res)
    return res
}

 沒有閉包的時候,函式就是一次性買賣,函式執行完畢後就無法再更改函式中變數的值(應該是記憶體釋放了);有了閉包後函式就成為了一個變數的值,只要變數沒被釋放,函式就會一直處於存活並獨享的狀態,因此可以後期更改函式中變數的值(因為這樣就不會被go給回收記憶體了,會一直快取在那裡