go语言中的闭包,是大家学习go语言的一个大难点,笔者在学习时候也是痛苦不堪,在来回对比了其它语言的用法,并且查阅了很多网上的文章,终于对闭包有了一个较为清晰的认识,以下就是关于闭包的解析

首先看一个代码示例(代码来自网上)

package main

import "fmt"

//构造闭包
func intSeq() func() int {
i := 0
return func() int {
i++
return i
}
} func main() {
nextInt := intSeq() //生成闭包 fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt()) newInts := intSeq() //创建新闭包环境
fmt.Println(newInts())
}

此代码运行结果如下:

1

2

3

1

  • 第一段代码有两个函数,第一个函数intSeq的返回值是一个匿名函数,这里的匿名函数没有参数传入,而是引用的外部函数的变量,作用就是为了构造闭包的。当运行nextInt := intSeq()时候,闭包产生,此时匿名函数引用的外部变量i,就被保留了下来,成为了自由变量。所以在后面运行fmt.Println(nextInt())的时候,变量i会由于闭包的存在,不会被运行完就销毁。所以运行三次fmt.Println(nextInt())时候,变量i的值分别为1、2、3。
  • 而当运行newInts := intSeq()时,相当于重新创建了闭包环境,所以运行fmt.Println(newInts())的时候,i会重新改变为1

所以由以上案例可以得知,go语言闭包产生的两个条件,一个是嵌套的匿名函数,第二个是运行环境。改变环境的话,闭包会重新生成。

此时我们可以总结闭包的定义。闭包是由外部函数嵌套内部函数,内部函数引用了外部函数的变量。闭包形成后,当外部函数用完后,本该销毁的变量,可以被内部函数引用并且保留下来,作为自由变量使用,这就是闭包。

001_解析go语言中的闭包的更多相关文章

  1. Go语言中的闭包

    一.函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if.for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的情况下,局部变量生 ...

  2. 015_go语言中的闭包

    代码演示 package main import "fmt" func intSeq() func() int { i := 0 return func() int { i++ r ...

  3. 002_解析go语言中的回调函数

    回调函数是一种特殊的函数写法,在很多场景中发挥广泛的作用.但是对于初学者来说,回调函数是比较头疼的一个东西,不太好懂,笔者研究了一番,以网上的一个例子详细说明一下 首先看一个代码示例(来源于网上) p ...

  4. [译] Closures in Lua - Lua中的闭包

    原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...

  5. [转][译] Closures in Lua - Lua中的闭包

    http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...

  6. javaScript中的闭包原理 (译)

    这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...

  7. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  8. C语言中的声明解析规则——数组,指针与函数

    摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...

  9. (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

    使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解   本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创 ...

随机推荐

  1. java 面向对象(二十):类的结构:代码块

    类的成员之四:代码块(初始化块)(重要性较属性.方法.构造器差一些)1.代码块的作用:用来初始化类.对象的信息2.分类:代码块要是使用修饰符,只能使用static分类:静态代码块 vs 非静态代码块3 ...

  2. OSCP Learning Notes - Exploit(7)

    Pre-Exploit Password Attacks Tools: 1. ncrack Ncrack 0.6 ( http://ncrack.org )Usage: ncrack [Options ...

  3. Android 性能优化 ---- 内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...

  4. var 的一个坑,以及 let

    选自 Typescript 中文教程. 快速的猜一下下面的代码会返回什么: for (var i = 0; i < 10; i++) { setTimeout(function() { cons ...

  5. 如何将 Bitbucket 的 pull request 签出到本地 review

    将 pull request 签出到本地进行 review, 最大的好处是可以通过 IDE 来查找各种变量和方法的上下文引用,以便充分发挥我们杠精的本领,将 pull request 中的各种合理和不 ...

  6. 《Head First 设计模式》:工厂方法模式

    正文 一.定义 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. PS:在设计模式中,"实现一个接口"泛指实现某个超类型(可 ...

  7. Android 性能优化---布局优化

    Android 性能优化---布局优化 Android 布局绘制原理 布局加载过程 setContentView() --> inflate() -- > getLayout()(I/O操 ...

  8. APP自动化 -- 坐标获取和点击

    一.获取元素坐标 二.点击坐标 1.driver的点击(这个可以实现多点同时点击) 1)执行 这个coordinate变量必须是一个list coordinate_list = [(0, 0), (1 ...

  9. Python语言及其应用PDF高清完整版免费下载|百度云盘|Python新手入门

    百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...

  10. Go语言系列之手把手教你撸一个ORM(一)

    项目地址:https://github.com/yoyofxteam/yoyodata 欢迎星星,感谢 前言:最近在学习Go语言,就出于学习目的手撸个小架子,欢迎提出宝贵意见,项目使用Mysql数据库 ...