GO语言小锤硬磕十一.匿名函数和闭包

匿名函数是函数的一种,格式和普通函数一样,只是定义时没有函数名

        普通函数的函数名是固定的,匿名函数的函数名称是系统随机的

匿名函数可以定义在函数外(全匿名函数),也可以定义在函数内(局部匿名函数),GO语言的普通函数不能嵌套定义,但是可以通过匿名函数来实现函数的嵌套定义

package main
import "fmt"
//全局匿名函数
//方式1
var a = func(){
    fmt.Println("hellow world")
}

//方式2
var (
    b = func(){
        fmt.Println("hellow world")
    }
)

func main(){
    a()
    b()
}

       一般情况很少使用全局匿名函数,大多数情况都是使用局部匿名函数,匿名函数可以直接调用、保存到变量、作为参数或者返回值

package main
import "fmt"
func main(){

//例1 直接调用
    func(s string){
        fmt.Println(s)
    }("hello lnj")

//例2 保存到变量
    
    a := func(s string){
        fmt.Println(s)
    }
    a("hello lnj")

//例3 作为参数
    //调用函数,传递一个匿名函数
    test1(func(s string){
        fmt.Println(s)
    })

//例4 作为返回值
    res :=test2() //执行函数,返回一个匿名函数
    res(10,20)   //执行匿名函数

}

//定义一个函数 ,参数是一个匿名函数
func test1(f func(s string)){
    f("hello lnj")    //执行匿名函数
}
//定义一个函数 ,返回值是一个匿名函数
func test2() func(int,int){
    return func(a int, b int){
        fmt.Println(a+b)
    }
}

匿名函数的使用

        当某个函数只需要调用一次时,可以使用匿名函数

        需要执行一些不确定操作时,可以使用匿名函数

package main
import "fmt"
func main(){
    //项目经理
    work(func(){
        fmt.Println("组织部门开会")
    })
    //程序员
    work(func(){
        fmt.Println("码代码")
    })
    
}

func work(custom func()){
    //定义并执行匿名函数
    func(){
        fmt.Println("起床")
    }()                        //这个括号是重点
    
    //执行传入的匿名函数
    custom()
    
    //定义并使用一个局部匿名函数
    latter := func(){
        fmt.Println("睡觉")
    }
    latter()
    
 

}

闭包是一个特殊的匿名函数,他是匿名函数和相关引用环境组成的整体

                可以理解为只要匿名函数中用到了外界的变量,那么这个匿名函数就是一个闭包

                闭包中使用的变量和外界的变量是同一个变量,所以可以在闭包中修改外界变量

package main
import "fmt"
func main(){

//例1  定义匿名函数时用到了main函数的num,这个匿名函数就是一个闭包
    num := 10
    a := func(){
        num++    
        fmt.Println(num)
    }
    a()

//例2    闭包中使用的变量和外界的变量是同一个,可以在闭包中修改外界变量
    num1 :=1
    b := func(){
        num1 = 2
    }
    fmt.Println(num1)     //1
    b()
    fmt.Println(num1)     //2

//例3    只要闭包还在使用外界的变量,外界的变量就会一直存在,不被释放
    res := addUpper()  //执行addUpper函数返回匿名函数,这个匿名函数使用了外部的x所以被称为闭包    
    fmt.Ptintln(res()) //2    闭包使用后并没有被释放,所以x的值没有释放
    fmt.Ptintln(res()) //3    闭包再次使用
    fmt.Ptintln(res()) //4
    
}

func addUpper() func() int{
    x:=1        //定义了一个局部变量
    return func() int{    //返回一个匿名函数,匿名函数的返回值是一个整型
        x++
        return x
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值