1. 程式人生 > >Go語言-make陷阱和閉包函數

Go語言-make陷阱和閉包函數

相關 運行 closure Go 需要 ber enc seq sum

Go語言make陷阱
a := make([]int, 3)

a = append(a, 1, 2, 3)

切片大小變成6

匿名函數

匿名函數是指不需要定義函數名的一種函數實現方式,可以直接賦值給一個變量或者直接運行

閉包

Go的匿名函數是一個閉包,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者,任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變量包含,在代碼塊中,所以這些自由變量以及它們引用的對象沒有被釋放)為自由變量提供綁定的計算環境(作用域)。

閉包的價值在於可以作為函數對象或者匿名函數。

閉包的字面定義:閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)。這個從字面上很難理解,特別對於一直使用命令式語言進行編程的程序員們。

閉包裏變量的生命周期跟閉包變量的周期一樣

Go中的閉包,一個函數和與其相關的引用環境組合而成的實體。

Go裏有函數類型的變量,這樣,雖然不能在一個函數裏直接聲明另一個函數,但是可以在一個函數中聲明一個函數類型的變量,此時的函數稱為閉包(closure)。

實例1:

package main

import "fmt"

func getSequence() func(i int) int {

            sum:=0

             return func(i int) int {

                sum = sum +i

                return sum

    }

}

func main(){

        nextNumber := getSequence()

        fmt.Println(nextNumber(1))

        fmt.Println(nextNumber(1))

        fmt.Println(nextNumber(1))

        nextNumber1 := getSequence()

        fmt.Println(nextNumber1(1))

        fmt.Println(nextNumber1(1))

}

運行結果

1
2
3
1
2

實例2

package main

import "fmt"

func getSequence() func() int {

    sum:=0

    return func() int {

                sum += 1

                return sum

             }

}

func main(){

        nextNumber := getSequence()

        fmt.Println(nextNumber())

        fmt.Println(nextNumber())

        fmt.Println(nextNumber())

        nextNumber1 := getSequence()

        fmt.Println(nextNumber1())

        fmt.Println(nextNumber1())

}

運行結果

1
2
3
1
2

實例3

package main

import "fmt"

func main(){

        sum1 := 10

        getSequence := func() func() int {

                     sum:=0

                     return func() int {

                                fmt.Println(sum1)

                                sum += 1

                                return sum

                     }

        }

        nextNumber := getSequence()

        fmt.Println(nextNumber())

        fmt.Println(nextNumber())

        fmt.Println(nextNumber())

        nextNumber1 := getSequence()

        fmt.Println(nextNumber1())

        fmt.Println(nextNumber1())

        fmt.Println("end:",sum1)

}

運行結果

10
1
10
2
10
3
10
1
10
2
end: 10

Go語言-make陷阱和閉包函數