Go 和Python中的闭包实现及使用

闭包

网上闭包的概念已经很多了, 在这就简单说一下

体现:  在一个函数内部(外函数)返回另外一个函数(内函数)
	   内函数使用外函数的局部变量
	   外函数的返回值是内函数的引用
	   只要闭包还被使用,那么被闭包引用的变量会一直存在

使用场景

比如说 你有一个变量需要放到内存中, 然后只希望那个变量由你想要的方式去改变, 其他人不能去改变的时候就可以用到了

实例

我有一个方法需要判断es有没有这个库, 我想把有的索引库放到内存里, 方便所有人进行判断操作 (这只是一个简单demo, 真正要用的时候 Map 需要用到读写锁, 可以看我另一篇文章 https://blog.youkuaiyun.com/ywdhzxf/article/details/93786811)

package main

import "fmt"

// indexCache  index缓存
func indexCache() func(index string) (bool, error) {
	cache := map[string]interface{}{}
	return func(index string) (bool, error) {
		if val, ok := cache[index]; ok {
			fmt.Println(val)
			return true, nil
		} else {
			bol, _ := demo(index)
			if bol {
				cache[index] = 1
				return true, nil
			}
			return false, nil
		}
	}
}

// demo  把这个方法当做查询es是否有这个索引库
func demo(index string) (bool, error) {
	data := map[string]interface{}{
		"aaa": "bbb",
	}
	if _, ok := data[index]; ok {
		return true, nil
	} else {
		return false, nil
	}
}
func main() {
	var isExists = indexCache()
	fmt.Println(isExists("aaa"))
	fmt.Println(isExists("bbb"))
	fmt.Println(isExists("aaa"))

}

返回

true <nil>
false <nil>
1
true <nil>

可以看到临时变量会被保留

Python实现
def indexCache():
    cache = {}
    def isIndex(index):
        if bool(cache.get(index)):
            return 1
        else:
            bol = demo(index)
            if bol:
                cache[index] = 1
                return 1
            else:
                return 0

    return isIndex


def demo(index):
    data = {"aaa": "bbb"}
    if bool(data.get(index)):
        return 1
    else:
        return 0


if __name__ == '__main__':
    isExists = indexCache()
    print(isExists("aaa"))
    print(isExists("bbb"))
    print(isExists("aaa"))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小僵尸打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值