闭包
网上闭包的概念已经很多了, 在这就简单说一下
体现: 在一个函数内部(外函数)返回另外一个函数(内函数) 内函数使用外函数的局部变量 外函数的返回值是内函数的引用 只要闭包还被使用,那么被闭包引用的变量会一直存在
使用场景
比如说 你有一个变量需要放到内存中, 然后只希望那个变量由你想要的方式去改变, 其他人不能去改变的时候就可以用到了
实例
我有一个方法需要判断es有没有这个库, 我想把有的索引库放到内存里, 方便所有人进行判断操作 (这只是一个简单demo, 真正要用的时候 Map 需要用到读写锁, 可以看我另一篇文章 https://blog.csdn.net/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"))