内容简介:闭包是匿名函数与匿名函数所引用环境的组合。看一个例子:看了以上两个例子,大概可以对闭包有个简单的认识,匿名函数可以直接引用上一级函数内的变量, 所以可以看到第一个例子进行 n+1 操作修改了main函数中的n的值。
要弄明白defer首先得搞清楚闭包和局部作用域。
闭包
闭包是匿名函数与匿名函数所引用环境的组合。
看一个例子:
func main() {
n := 0
f := func() {
n += 1
}
f()
fmt.Println("n = ", n)
}
// output: n = 1
func main() {
n := 0
f := func(n int) {
n += 1
}
f(n)
fmt.Println("n = ", n)
}
// output n = 0
看了以上两个例子,大概可以对闭包有个简单的认识,匿名函数可以直接引用上一级函数内的变量, 所以可以看到第一个例子进行 n+1 操作修改了main函数中的n的值。
而第二个函数中的匿名函数需要传参n, 因为 go 中的传参都是值类型的, 所以不会修改外部变量n 输出扔为0。
这篇文章的重点不是为了介绍闭包,所以这里只介绍这么多,有兴趣可以去网上找相关文章查阅。
继续说defer
- defer调用过程:
- 返回值为 xxx
- 调用defer函数
- return
其实defer的调用相当于一个内部函数的调用,可以看以下例子:
func f() (r int) {
// go函数编译的时候已经将带名字的返回值变量给初始化
// 所以在返回值的时候调用defer函数会改变其值
r = 5
defer func() {
r = r + 5
}()
return
}
// output 10
// 与闭包中的第一个例子类似,defer 函数修改了r的值
// 返回值r = 5
// 调用defer函数 r += 5 => r = 10
// return r => 10
例2
func f() (r int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
// 结合上边说的defer调用过程:
// 返回值 r = t 对r进行赋值操作
// defer 修改 t 的值 t+= 5 => t =10
// return r => r = 5
例3
func f() int {
t := 5
defer func() {
t = t + 5
}()
return t
}
// 同样结合调用过程:
// 返回值赋值 这里的返回值是个匿名变量, 假设这个匿名变量为NoName = t = 5
// defer 调用 t+= 5 => t = 10
// 返回 NoName = 5
例4
func f3() (r int) {
// defer的时候 r为0
defer func(r int) {
r = r + 5
}(r)
return 1
}
// 结合defer调用过程
// 返回值 r 赋值 r = 1
// 带参数r的匿名函数 进行defer调用, 参考闭包中的例子2 知道 r的传入不会影响外部r的值, 所以匿名函数外部的 r扔为1
// 返回 r的值 1
以上, 即为defer的几种调用。
文章内容有所参考, 如下:
Golang之轻松化解defer的温柔陷阱以上所述就是小编给大家介绍的《golang关于defer的问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- acme.sh 续期问题(路径问题)
- 缓存的一些问题和一些加密算法【缓存问题】
- 如何把设计问题转化为数学问题(方法论)
- 推荐系统中的冷启动问题和探索利用问题
- GraphQL 教程(六)—— N+1问题和缓存等问题
- Golang 并发问题(四)之单核上的并发问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
韦斯 (Mark Allen Weiss) / 机械工业出版社 / 2013-2-1 / 79.00元
本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长。本书将算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,并细致讲解精心构造程序的方法,内容全面、缜密严格。 第3版的主要更新如......一起来看看 《数据结构与算法分析》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
在线进制转换器
各进制数互转换器