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

117 阅读1分钟

闭包

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

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

使用场景

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

实例

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

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"))