博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go 匿名函数与闭包的使用
阅读量:7082 次
发布时间:2019-06-28

本文共 1614 字,大约阅读时间需要 5 分钟。

匿名函数: 没有函数名的函数

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

package mainimport (    "fmt")func main() {    a := 10    str := "make"    //匿名函数,没有函数名字,函数定义,还没有调用    f1 := func() {        fmt.Println("a=",a)        fmt.Println("str=",str)    }    f1()    // 给一个函数类型起别名    type FuncType func()  // 函数没有参数,没有返回值    // 声明变量    var f2 FuncType    f2 = f1    f2()    //定义匿名函数,同时调用    func() {        fmt.Printf("a=%d,str=%s\n", a,str)    }()  // 后面的()代表调用匿名函数    // 带参数的匿名函数    f3 := func(i,j int) {        fmt.Printf("i =%d, j=%d\n",i,j)    }    f3(1,2)    //定义匿名函数,同时调用    func(i, j int) {        fmt.Printf("i=%d,j=%d\n", a,j)    }(10,20)  // 后面的()代表调用匿名函数    //匿名函数,有参数有返回值    x,y := func(i, j int) (max, min int){        if i > j{            return i,j        }else {            return j,i        }    }(10,20)    fmt.Println(x,y)}

闭包

package mainimport "fmt"func test01() func() int {    var x int  // 没有初始化, 值为0    return func() int {        x++        return x * x    }}func test02() int {    var x int    x++    return x *x}func main() {    // 返回值为一个匿名函数,返回一个函数类型,通过f来调用返回的匿名函数    // 它不关心这些捕获了的变量和常量是否超出了作用域    // 所以只要闭包还在使用它,这些变量就还会存在    f := test01()    fmt.Println(f())  //1    fmt.Println(f())  //4    fmt.Println(f())  //9    fmt.Println(f())  //16    // 用完就释放了,每次调用还是1    fmt.Println(test02())    fmt.Println(test02())    fmt.Println(test02())}

转载于:https://blog.51cto.com/13764714/2376116

你可能感兴趣的文章
0-Microsoft Lync Server 2010-部署
查看>>
混乱开发,既伤身体又伤感情
查看>>
Hi,我们的代码重构了
查看>>
电子商务站点遭勒索 F5路见不平显神功
查看>>
如何在项目实施过程提高系统运维水平
查看>>
sqlldr的介绍
查看>>
iptables从入门到精通
查看>>
马哥Linux线下活动和学员风采
查看>>
PHP中$_SERVER的详细参数与说明
查看>>
Android Studio使用说明
查看>>
功能应用程序延迟发送:4款定时发送短信的应用程序
查看>>
linux shell脚本获得当前文件路径
查看>>
畅想(3)-下一步的计划
查看>>
Tail Recursion, Recursion, Concepts and Examples
查看>>
任务超期后的定时器处理
查看>>
myeclipse乱码问题和 编码设置
查看>>
WEB打印的几种方案
查看>>
linux下安装QT过程
查看>>
ADO.NET访问SQL Server调用存储过程带回参
查看>>
为outlook增加“邮件召回”功能
查看>>