Golang闭包和匿名函数
1. 匿名函数
匿名函数就是没有函数名的函数,如下所示。
func test() int {
max := func(a, b int) int {
if a > b {
return a
} else {
return b
}
}(, )
return max
}
func main() {
primeCnt := make(chan int, )
N :=
go func(N int) {
cnt :=
for i := ; i < N; i++ {
var j int
for j = ; j <= int(math.Sqrt(float64(i))); j++ {
if i%j == {
break
}
}
if j > int(math.Sqrt(float64(i))) {
cnt++
fmt.Println(i)
}
}
primeCnt <- cnt
}(N)
fmt.Println("totalNum:", <-primeCnt)
}
基本上匿名函数也没啥好说的 。。。
2. 闭包
闭包感觉就是返回值为匿名函数的函数。。。来看个例子吧 (◉3◉)
package main import (
"fmt"
) func squares() func() int {
var x int
return func() int {
x++
return x * x
}
} func main() {
f := squares()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
运行结果如下所示,可以看到三次调用f(),获得的是不同的x。即便是x是squares的局部变量,但是变量x的生命周期被延长到了三次函数调用( f() )。这是为什么呢?让我们在看看另一种情况。

package main import (
"fmt"
) func squares() func() int {
var x int
return func() int {
x++
return x * x
}
} func main() {
f := squares()
f1 := squares()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f()) fmt.Println(f1())
fmt.Println(f1())
fmt.Println(f1())
}

看到了吧。换个变量就又重新开始了。嘿嘿嘿。为什么会这样,一句话,内存逃逸。什么是内存逃逸,简单地说就是本来在栈上的变量又跑到堆里去了。当然这么讲过于简单了,改天再写一文谈谈内存逃逸给各位太君,嘿嘿嘿。那么怎么才能检测程序有没有发生内存逃逸呢。go build工具就欧克了。如下图所示。
从图中我们可以看到变量x被移动到了堆中,这也就解释了为什么x的生命周期可以被延长。

参考
https://juejin.im/post/5c850d035188257ec629e73e 关于闭包的分析
《Go程序设计语言》
Golang闭包和匿名函数的更多相关文章
- PHP中的闭包和匿名函数
闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...
- 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...
- 闭包(匿名函数) php
php中的闭包,之前不理解.以前项目中虽然有用到,也是别人怎么用,自己也跟着怎么用,也没具体去看一下,时间长了就忘了,也不知道闭包是怎么回事.今天网上搜集了关于php闭包相关的文章,看了7,8篇,干货 ...
- 浅析PHP中的闭包和匿名函数
PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧 闭包是指在创建时封 ...
- PHP闭包和匿名函数
概念 闭包和匿名函数在PHP5.3.0中被引入. 闭包 闭包是指创建时封装周围环境的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.这个概念很难理解,不过没关系,继续看下去就会明白了. 匿 ...
- 初探swift语言的学习笔记三(闭包-匿名函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- php 回调函数结合闭包(匿名函数)的使用示例
<?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...
- Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。
本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...
- GOLANG 闭包和普通函数的区别
闭包和匿名函数是一回事 闭包使用完毕之后不会自动释放,值依然存在 普通函数调用完毕后,值会自动释放
随机推荐
- 谈一谈 Normalize.css
Normalize.css是一种CSS reset的替代方案.它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML ...
- Elasticsearch-数值类型
Elasticsearch-数值类型 数值类型可以是浮点数,也可以是费浮点数.如果不需要小数,可以选择byte.short.int或者long.如果确实需要小数,可以选择float和double.这些 ...
- (5.3)mysql高可用系列——mysql复制之复制的参数
参考:https://www.iteye.com/blog/shift-alt-ctrl-2269539 详情 [1]参数 #[1.1]基本参数 bind-address=192.168.1.201 ...
- Spread.NET 表格控件 V12.0 Update2 发布更新
Spread.NET表格控件V12.0 Update 2 已经正式发布,本次发布主要针对WinForm平台下客户反馈的产品使用功能进行优化,并修复了已知问题,具体修复情况见下方说明. Spread.N ...
- 使用javascript完成一个简单工厂设计模式。
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...
- 四则运算计算器的微信小程序_2 运算
js文件: function isOperator(value) { var operatorString = '+-*/()×÷'; return operatorString.indexO ...
- Git 实习一个月恍然大悟合集
从开始实习到现在大概有一个月了,这个月时间接触了很多新东西,其中就包括了git版本控制.分支管理等等.我在这段时间里,深深地感受到了git对公司项目代码管理和控制.团队合作带来的益处和其重要性.其实在 ...
- SVN服务器搭建与配置管理
1.下载和搭建SVN服务器 现在Subversion已经迁移到Apache网站上了,下载地址:http://subversion.apache.org/packages.html,这是二进制文件包的下 ...
- redis的string和list
- API 网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd
前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...