GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释

基本概念
闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者
任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含
在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环
境(作用域)。
 闭包的价值
闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示
数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到
变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

重点来了,先看一段代码:

package main
import "fmt" func adder() func(int) int{
fmt.Println("this line exec")
sum :=
return func(x int) int{
fmt.Println("sum = ",sum)
sum += x
return sum
}
} func main(){
pos , neg := adder(),adder()
for i:= ; i< ; i++ {
fmt.Println(pos(i),neg(-*i))
}
}

执行结果如下:

this line exec
this line exec
sum = 0
sum = 0
0 0
sum = 0
sum = 0
1 -2
sum = 1
sum = -2
3 -6
sum = 3
sum = -6
6 -12

-----------------------------

从打印中可以看出,对于闭包而言,重要的是返回的匿名函数,对于在代码区域内的闭包,其闭包内的变量是未销毁的,这也是sum的变量值保存的原因,而且,sum = 0只是执行了一次。这也就是说,对于闭包而言,其初始化一次后,匿名函数内的变量就一直不被销毁(代码区域内),每次执行闭包,闭包内的变量有保存了上一次运行后的值。所以,看下边代码:

func adder() func(int) int{
fmt.Println("this line exec")
sum :=
return func(x int) int{
fmt.Println("sum = ",sum)
sum += x
return sum
}
} func main(){
pos := adder()
for i:= ; i< ; i++ {
fmt.Println(pos())
}
}

结果是:

this line exec
sum = 0
1
sum = 1
2
sum = 2
3
sum = 3
4

可以更清晰的了解。

Golang中的匿名函数(闭包)的更多相关文章

  1. golang中的匿名函数三种用法

    package main import ( "fmt" "strconv" ) func main() { // 匿名函数的使用:方式1 f1 := func( ...

  2. php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  3. php中的匿名函数(Anonymous functions)和闭包函数(closures)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  4. Go语言中的匿名函数和闭包的样子

    1). 函数也是值,可以像普通值那样,传来传去: 2). 匿名函数: 3). 函数的类型,类似于:func(float64,float64) float64 ===================== ...

  5. [转]JavaScript中的匿名函数及函数的闭包

    JavaScript中的匿名函数及函数的闭包  原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...

  6. JavaScript中的匿名函数及函数的闭包(转)

    JavaScript中的匿名函数及函数的闭包  https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...

  7. 转:php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  8. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  9. php : 匿名函数(闭包) [一]

    摘自: http://www.cnblogs.com/starlion/p/3894578.html 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous fu ...

随机推荐

  1. System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

    System.Windows.Forms.Timer.System.Timers.Timer.System.Threading.Timer的 区别和用法http://space.itpub.net/1 ...

  2. 自在因梦 | 威爾伯的Fourth Turning所引發的聯想

    2015-05-06                                                 胡因梦                                       ...

  3. 如何让JavaScript元素运动起来 ?

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. linux下安装jdk8并且配置环境变量

    su回车进入root账户 查看是否安装过jdk8使用命令 # rpm -qa | grep -i jdk 创建文件夹用来存放下载的jdk使用命令 # mkdir -p /usr/local/src/j ...

  5. flask 之(二) --- 视图|模版|模型

    Flask框架 打开pycharm编译器,新建一个Flask项目,选择提前建好的虚拟环境 . 项目结构: static:静态资源文件,可以直接被浏览器访问 templates:模版文件,必须在项目的p ...

  6. python网络应用篇

    正则表达式 import re #引入正则表达式模块  使用re.match/search函数进行匹配(区别:match只匹配字符串的开始,如果不符合正则表达式,则匹配失败,返回None,而searc ...

  7. android webview 添加内置对象

    package com.android.EBrowser; import android.app.Activity;import android.graphics.Rect;import androi ...

  8. WinForm笔记1:TextBox编辑时和DataGridView 单元格编辑时 的事件及其顺序

    TextBox 编辑框 When you change the focus by using the mouse or by calling the Focus method, focus event ...

  9. 前端实现app引导页面动画效果

    插件描述:jQuery引导插件TourTip 交互式可视化指南网页上的元素.使用方法 步骤1: 将以下标记添加到您的文档的<head> 你还需要复制旁边插件的css文件夹和下载的IMG文件 ...

  10. PTA(Basic Level)1038.统计同成绩学生

    本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔 ...