Go 语言闭包

说到Go语言的闭包,不得不说说全局变量和局部变量

全局变量的特点:
1.常驻内存
2. 污染全局
局部变量的特点:
1.不常驻内存
2.不污染全局

而Go语言的闭包可以做到

 1.可以让变量常驻内存
  2.可以让变量不污染全局

所以闭包主要是为了避免全局变量的滥用。

闭包
1.闭包是指有权访问另一个函数作用域中的变量的函数
2.创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量

注意:
闭包里作用域返回的局部变量不会被立刻销毁回收,但过度使用闭包可能会占用更多内存,导致性能下降。

例1

func adder() func()int{
i:=10
return func()int{
return i+1
}
}

func adder1() func(x int)int{
i:=10
return func(x int)int{
i=i+x
return i
}
}

func main() {
fn := adder()
fmt.Println(fn()) //11
fmt.Println(fn()) //11

fn1 := adder1()
fmt.Println(fn1(10))  //20
fmt.Println(fn1(10))  //30

}

有人形象的概括闭包就是:函数 + 引用环境 = 闭包

同一个函数与不同引用环境组合,可以形成不同的闭包实例。

例2

func addTool() func(int) int {

var n = 10

return func(x int) int {

    n = n + x

    return n

}

}

func main() {

f := addTool()

fmt.Println(f(1))//11

fmt.Println(f(2))//13

fmt.Println(f(3))//16

}

对例2代码的总结:

addTool是一个函数,返回的数据类型是func(int)int
绿色代码就是闭包,返回的是一个匿名函数,但是这个匿名函数引用到函数外面的n,因此这个匿名函数就和n形成一个整体,构成闭包。
大家可以这样理解:闭包是类,函数是操作,n是字段,函数和他使用的变量构成闭包
当我们反复调用f函数时,因为n是初始化一次,因此每调用一次就进行累计。
我们搞清楚闭包的关键就是分析出返回的函数和他引用到哪些变量。
以上参考:go语言的闭包 - 知乎



文章链接:
Go 语言闭包详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包函数是指内部函数可以访问外部函数的局部变量,并且在外部函数执行结束后,依然可以访问和修改这些变量。在Go语言中,函数也可以作为返回值返回,形成闭包闭包函数可以用来实现函数式编程的一些特性。 函数式编程是一种编程范式,它将计算过程看作是一系列函数的应用。在函数式编程中,函数被视为一等公民,可以像其他数据类型一样传递、赋值和返回。函数式编程强调使用纯函数,即不依赖于外部状态和副作用的函数,这样可以提高代码的可读性、可维护性和并发性。 在Go语言中,闭包函数函数式编程可以结合使用。通过闭包函数,我们可以在函数内部定义其他函数,并且这些内部函数可以访问外部函数的局部变量。这样就可以实现一些函数式编程的特性,例如高阶函数、柯里化和函数组合等。 以下是一个示例代码,演示了Go语言闭包函数函数式编程的用法: ```go package main import "fmt" // 返回一个闭包函数,用于累加计数 func counter() func() int { count := 0 return func() int { count++ return count } } // 使用高阶函数将一个整数加倍 func double(n int) int { return n * 2 } // 使用高阶函数将两个整数相加 func add(a, b int) int { return a + b } func main() { // 使用闭包函数创建一个计数器 c := counter() // 调用计数器函数,并打印结果 fmt.Println(c()) // 输出: 1 fmt.Println(c()) // 输出: 2 // 使用高阶函数将整数加倍,并打印结果 fmt.Println(double(5)) // 输出: 10 // 使用高阶函数将两个整数相加,并打印结果 fmt.Println(add(3, 4)) // 输出: 7 } ``` 在上面的示例中,`counter`函数返回了一个闭包函数,用于实现简单的计数器。`double`函数和`add`函数都是高阶函数,可以作为参数传递给其他函数使用。这些示例展示了Go语言闭包函数函数式编程的一些用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值