Go语言闭包的设计

背景:

       之前开发一直没有注意到闭包的开发使用,今天无意间发现闭包的魅力。下面就以一个简单的示例做一个分析。

闭包:

原始含义:函数与其相关的引用环境组成一个整体,变量只需要设置一次,可以在多次调用中始终保留上次的引用值。

1、函数里面包含的子函数,子函数访问父函数的局部变量,也就是子函数与局部变量形成了一个整体。
2、通过return将子函数暴露在全局作用域,子函数就形成闭包
3、通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用return 之前的逻辑代码只能执行一次,可以理解为初始化1次,同时这个局部变量也不会被全局变量污染。

示例:

package main

import "fmt"

func main() {
	t := T(10)
	fmt.Println(t(1))
	fmt.Println(t(2))
	fmt.Println(t(3))
}

//其实可以理解为返回的函数为应用类型所以获取的值就是放在堆内存的数据,在线程内可以被引用
func T(a int) func(int) int {
	b := "Hello" //函数局部变量
	fmt.Println("------------", b)
	return func(i int) int {
		a = a + i
		return a
	}
}

结果:

------------ Hello
11
13
16

解析:

由上图可以知道,t:=T(10)作为一种初始化,此时直接执行了T函数中reutrn前的业务。

后面再调用t(1),t(2),t(3).会直接执行return后的业务,此时就形成了一个闭包;

T函数中的局部变量会受到保护,不被外界所干扰,仅仅提供给闭包函数内部使用。

使用场景:

GC垃圾回收机制内部,回调函数等业务需求,缺点是占用内存较大,如果只是简单的业务逻辑不需要采用闭包设计。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值