GO——闭包,又见闭包

编程之家收集整理的这篇文章主要介绍了GO——闭包,又见闭包编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、闭包定义(Closure)

来自wiki定义:彼得·兰丁在1964年将术语“闭包”定义为一种包含环境成分和控制成分的实体,用于在他的SECD机器上对表达式求值。 Joel Moses认为是Landin发明了“闭包”这一术语,用来指代某些其开放绑定(自由变量)已经由其语法环境完成闭合(或者绑定)的lambda表达式,从而形成了闭合的表达式,或称闭包。这一用法后来于1975年被Sussman和Steele在定义 Scheme语言的时候予以采纳,并广为流传。

闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。变量的作用域仅限于包含它们的函数,因此无法从其它程序代码部分进行访问。不过,变量的生存期是可以很长,在一次函数调用期间所创建所生成的值在下次函数调用时仍然存在。正因为这一特点,闭包可以用来完成信息隐藏,并进而应用于需要状态表达的某些编程范型中。
不过,用这种方式来使用闭包时,闭包不再具有引用透明性,因此也不再是纯函数。即便如此,在某些“近似于函数式编程语言”的语言,例如Scheme中,闭包还是得到了广泛的使用。

顺便提一嘴:百度百科的经专家鉴定的词条“闭包”,真心看不懂,哎~~~

2、Go Lang中的闭包

斐波那契数列:斐波那契数列是一种数列,它的规律是数列中某一个位置的数字是该位置的前两个位置的数字之和。像这样:0, 1, 1, 2, 3, 5, 8, 13…
那就使用闭包实现数列算法:

package main
import "fmt"
// 1.定义单纯的加法函数
func add(x, y int) int {
    return x + y
}
// 2.fibonacci 函数,返回值是一个函数
func fibonacci(s1, s2 int) func() int {
    //闭包使用到的环境变量,除初始化外,都会保持值    
    left := s1
    right := s2
    return func() int {        
        next := add(left, right)       
        left = right
        right = next       
        return next
    }
}

func main() {
    // 调用一次闭包函数来得到闭包函数的初始化
    f := fibonacci(0, 1)
    for i := 0; i < 10; i++ {
        // 反复不断的调用f得到结果
        fmt.Println("next value: ", f())
    }
    //再来一次新函数初始化,会生成第二个实例
    f2 := fibonacci(0, f2())
    }
}

3、复习对比下Javascript的闭包

// 1.定义单纯的加法函数
function add(x, y) {
    return x + y;
}
// 2.fibonacci 函数,返回值是一个函数
function fibonacci(s1, s2) {
    //闭包使用到的环境变量,除初始化外,都会保持值    
    var left  = s1;
    var right = s2;
    return function(){        
        var next = add(left, right)  ;     
        left = right;
        right = next   ;    
        return next;
    }
}


// 调用一次闭包函数来得到闭包函数的初始化
var f = fibonacci(0, 1);
for(i = 0; i < 10; i++ ){
	// 反复不断的调用f得到结果
	console.log("next value: ", f())
}
//再来一次新函数初始化,会生成第二个实例
var f2 = fibonacci(0, f2())
}

4、结语

go lang的语法啊,还需要多熟悉,很多用法都很生疏,呵呵,慢慢来~~

总结

以上是编程之家为你收集整理的GO——闭包,又见闭包全部内容,希望文章能够帮你解决GO——闭包,又见闭包所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群:1065694478(已满)
编程之家官方2群:163560250(已满)
编程之家官方3群:312128206

相关文章

猜你在找的JavaScript相关文章

JavaScript 提供两种相等运算符:== 和 。 在日常开发中,通常推荐使用 ,那么这两者到底有什么区别呢? 简单说,它们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符( )比较它
临时需要个定时截屏,监控一个软件的运行,网上的下载软件杂七杂八,不如直接撸一个吧,so easy!初始化项目npm init 初始化一个nodejs项目准备nodejs类库包 npm install --save screenshot-desktop npm install --save node-schedule npm install --save mo...
目录1、闭包定义(Closure)2、Go Lang中的闭包3、复习对比下Javascript的闭包4、结语引用链接1、闭包定义(Closure)来自wiki定义:彼得·兰丁在1964年将术语“闭包”定义为一种包含环境成分和控制成分的实体,用于在他的SECD机器上对表达式求值。 Joel Moses认为是Landin发明了“闭包”这一术语,用来指代某些其开放绑定(自由变量)已经由其语法环境完...
http://download.csdn.net/source/2804466前几年做的最有意义的一件翻译事情了,文档可以在百度文库上搜索。Canvas 2D API 规范 1.0 中文版闪亮登场,相信是您学习HTML5的canvas元素api的首选教材,里面有丰富的例子,并且均在IE9下成功测试。希望大家多多支持。下面是目录:摘要 21 介绍 21.1 术语: 22 C...
英文内容:http://code.google.com/intl/zh-CN/closure/library/中文内容:http://www.codeex.cn/blog/article.asp?id=33    
无头浏览器的安装,在国内可谓一波三折,因为伟大的樯的存在,你如果能按github上的步骤安装成功,算我输。服务器Centos 7下安装不可能安装为UI模式,要不你服务器的命令行岂不是白敲了。在此模式下,先建立本地repo。1、添加Rep源$ sudo touch /etc/yum.repos.d/google.repo使用vi打开文件,填充内容如下:[google]name=G...
这是一个头疼的事情,毕竟第二个显示器技术的应用也就这几年的事。弹出窗口的小事情多年前,被做烂的弹窗,逼得各大浏览器纷纷出手,直接block掉多次弹窗,避免疯狂弹窗对用户的一万点暴击!因此使用弹窗要小心,一不留神不见了!今天忽然有人问我,“老大,能否实现弹窗到第二个显示器?” “这有啥难得,分分钟帮你搞定?”“话说,打脸,不要太疼!”想象一下一个会议室中的用户配备了投影仪,他们通过HDMI电缆连接到该投影仪。我们经常不是将演示文稿镜像到远程端点,而是真正希望在投影仪上全屏显示幻灯片,而让笔.
首先新建一个HTML:(引入jq)&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html lang=&quot;en&quot;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt; &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-sca