去语言开发(六),去语言闭包
一、函数式编程
1,函数式编程简介
函数式编程是一种编程模型,将计算机运算看作是数学中函数的计算,并且避免了状态以及变量的概念。
在面向对象思想产生前,函数式编程已经有数十年的历史。随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能问题所限制的动态语言开始受到关注、Python、Ruby和Lua等语言都开始在应用中崭露头角。动态语言因其方便快捷的开发方式成为很多人喜爱的编程语言,伴随动态语言的流行,函数式编程也开始流行。
2,函数式编程的特点
函数式编程的主要特点如下:
,变量的不可变性:变量一经赋值不可改变。如果需要改变,则必须复制出去,然后修改。
B,函数是一等公民:函数也是变量,可以作为参数,返回值等在程序中进行传递。
C,尾递归:如果递归很深的话,堆栈可能会爆掉,并导致性能大幅度下降。而尾递归优化技术(需要编译器支持)可以在每次递归时重用堆栈。
3,高阶函数
在函数式编程中,函数需要作为参数传递,即高阶函数。在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
,函数可以作为参数被传递
B,函数可以作为返回值输出
二,匿名函数
1,匿名函数简介
匿名函数是指不需要定义函数名的一种函数实现方式,匿名函数由一个不带函数名的函数声明和函数体组成。C和c++不支持匿名函数。
<代码> func (int x, y) int { 返回x + y }代码>
2,匿名函数的值类型
在去语言中,所有的函数是值类型,即可以作为参数传递,又可以作为返回值传递。
匿名函数可以赋值给一个变量:
<代码> f:=func int () { … }代码>
定义一种函数类型:
<代码>类型CalcFunc func (int x, y) int 代码>
函数可以作为值传递:
<代码> func AddFunc int (int x, y) { 返回x + y } func SubFunc int (int x, y) { 返回x - y } … func OperationFunc (int x, y, calcFunc calcFunc) int { 返回calcFunc (x, y) } 函数main () { 总结:=OperationFunc (1、2、AddFunc) 区别:=OperationFunc (1、2、SubFunc) … }代码>
函数可以作为返回值:
<代码>//第一种写法 函数添加(int x, y) func int () { f:=func int () { 返回x + y } 返回f }//第二种写法 函数添加(int x, y) func int () { int返回func () { 返回x + y } }代码>
当函数返回多个匿名函数时建议采用第一种写法:
<代码> func calc (int x, y) (func (int), func ()) { 外国游客1:=func (z int) int { 返回(x + y) * z/2 } int f2:=func () { 返回2 * (x + y) } 返回f1, f2 }代码>
匿名函数的调用有两种方法:
<代码>//通过返回值调用 函数main () { f1, f2:=钙(2,3) n1:=f1 (10) n2:=f1 (20) n3:=f2 () fmt。Println (“n1、n2, n3:“n1、n2, n3) }//在匿名函数定义的同时进行调用:花括号后跟参数列表表示函数调用 func safeHandler () { 推迟func () { 错:=恢复() 如果犯错!=nil { fmt。Println(“发生了一些异常:“哦,呃) } }() … }代码>
三、闭包
1,闭包的定义
函数可以嵌套定义(嵌套的函数一般为匿名函数),即在一个函数内部可以定义另一个函数.Go语言通过匿名函数支持闭包,c++不支持匿名函数,在c++中11通过λ表达式支持闭包。
闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。
闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,函数代码在函数被定义后就确定,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合。约束是指一个变量的名字和其所代表的对象之间的联系。由于在支持嵌套作用域的语言中,有时不能简单直接地确定函数的引用环境,因此需要将引用环境与函数组合起来。