闭包
网上闭包的概念已经很多了, 在这就简单说一下
体现: 在一个函数内部(外函数)返回另外一个函数(内函数)
内函数使用外函数的局部变量
外函数的返回值是内函数的引用
只要闭包还被使用,那么被闭包引用的变量会一直存在
使用场景
比如说 你有一个变量需要放到内存中, 然后只希望那个变量由你想要的方式去改变, 其他人不能去改变的时候就可以用到了
实例
我有一个方法需要判断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"))