博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言-make陷阱和闭包函数
阅读量:5901 次
发布时间:2019-06-19

本文共 2027 字,大约阅读时间需要 6 分钟。

Go语言make陷阱

a := make([]int, 3)a = append(a, 1, 2, 3)切片大小变成6

匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式,可以直接赋值给一个变量或者直接运行

闭包

Go的匿名函数是一个闭包,闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者,任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含,在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。

闭包的价值在于可以作为函数对象或者匿名函数。

闭包的字面定义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。

闭包里变量的生命周期跟闭包变量的周期一样

Go中的闭包,一个函数和与其相关的引用环境组合而成的实体。

Go里有函数类型的变量,这样,虽然不能在一个函数里直接声明另一个函数,但是可以在一个函数中声明一个函数类型的变量,此时的函数称为闭包(closure)。

实例1:

package mainimport "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))}

运行结果

12312

实例2

package mainimport "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())}

运行结果

12312

实例3

package mainimport "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)}

运行结果

101102103101102end: 10

转载于:https://blog.51cto.com/12880687/2130169

你可能感兴趣的文章
海归千千万 为何再无钱学森
查看>>
vue2.0 仿手机新闻站(六)详情页制作
查看>>
JSP----九大内置对象
查看>>
Java中HashMap详解
查看>>
delphi基本语法
查看>>
沙盒目录介绍
查看>>
260. Single Number III
查看>>
Hadoop生态圈-Kafka的完全分布式部署
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>