码迷,mamicode.com
首页 > 编程语言 > 详细

Go语言-make陷阱和闭包函数

时间:2018-06-17 16:08:14      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:func   []   生命周期   组合   匿名函数   +=   直接   命令式   函数名   

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陷阱和闭包函数

标签:func   []   生命周期   组合   匿名函数   +=   直接   命令式   函数名   

原文地址:http://blog.51cto.com/12880687/2130169

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!