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程序设计语言》

https://www.do1618.com/archives/1328/go-%E5%86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90/ 关于内存逃逸的分析

Golang闭包和匿名函数的更多相关文章

  1. PHP中的闭包和匿名函数

    闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...

  2. 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)

    很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...

  3. 闭包(匿名函数) php

    php中的闭包,之前不理解.以前项目中虽然有用到,也是别人怎么用,自己也跟着怎么用,也没具体去看一下,时间长了就忘了,也不知道闭包是怎么回事.今天网上搜集了关于php闭包相关的文章,看了7,8篇,干货 ...

  4. 浅析PHP中的闭包和匿名函数

    PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧   闭包是指在创建时封 ...

  5. PHP闭包和匿名函数

    概念 闭包和匿名函数在PHP5.3.0中被引入. 闭包 闭包是指创建时封装周围环境的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.这个概念很难理解,不过没关系,继续看下去就会明白了. 匿 ...

  6. 初探swift语言的学习笔记三(闭包-匿名函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  7. php 回调函数结合闭包(匿名函数)的使用示例

    <?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...

  8. Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。

    本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...

  9. GOLANG 闭包和普通函数的区别

    闭包和匿名函数是一回事 闭包使用完毕之后不会自动释放,值依然存在 普通函数调用完毕后,值会自动释放

随机推荐

  1. 使用PowerShell 自动安装.NET4.6.1离线包

    自动安装脚本在文章末尾 自动安装脚本在文章末尾 自动安装脚本在文章末尾 运行环境:Windows Server 2012 R2 开发环境:Win10 Microsoft .NET Framework ...

  2. 【数据库】Redis/MongoDB/MySQL/Oracle随笔索引

    数据库体系 [思维导图]数据库体系 密码: a8ni Redis JPA

  3. volatility 命令

    https://blog.csdn.net/chanyi0040/article/details/100956582 表格 1 Volatility支持的插件列表 插件名称 功能 amcache 查看 ...

  4. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

  5. 列出bug的几种状态

    1.New:(新的) 当某个“bug”被发现的时候(第一次),测试人员需要与项目负责人沟通以确认发现的的确是一个bug,如果被确认是一个bug,就将其记录下来,并将bug的状态设为New. 2.Ass ...

  6. 从入门到自闭之Python整型,字符串以及for循环

    Day 01 整型: 对比: 在python 2 版本中有整型,长整型long 在python 3 版本中全部都是整型 用于计算和比较 整型和布尔值的转换 二进制转换成十进制: ​ print (in ...

  7. Django基础之模型层(下)

    聚合查询 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 统计所有书的平均价格 models.Book.objects ...

  8. 基于apache-commons-email1.4 邮件发送

    MailUtil.java package com.lucky.base.common.util; import com.zuche.framework.utils.PropertiesReader; ...

  9. C语言经典100例(1-50)

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. main ...

  10. CF 403D Beautiful Pairs of Numbers

    The sequence of integer pairs (a1, b1), (a2, b2), ..., (ak, bk) is beautiful, if the following state ...