gpt4 book ai didi

go - 将缓存添加到 go 函数,就像它是静态成员一样

转载 作者:行者123 更新时间:2023-12-04 14:31:49 24 4
gpt4 key购买 nike

说我有一个昂贵的功能

func veryExpensiveFunction(int) int
并且这个函数被多次调用为相同的数字。
如果再次调用该函数甚至可以为veryExpensiveFunction2 重用,是否有一种好方法可以让该函数存储以前的结果以供使用?
显然,可以添加一个参数
func veryExpensiveFunctionCached(p int, cache map[int]int) int {
if val, ok := cache[p]; ok {
return val
}
result := veryExpensiveFunction(p)
cache[p] = result
return result
}
但是现在我必须在某个地方创建缓存,我不在乎它。如果可能的话,我宁愿将其作为“静态函数成员”。
在 go 中模拟静态成员缓存的好方法是什么?

最佳答案

你可以使用闭包;并让闭包管理缓存。

func InitExpensiveFuncWithCache() func(p int) int {
var cache = make(map[int]int)
return func(p int) int {
if ret, ok := cache[p]; ok {
fmt.Println("from cache")
return ret
}
// expensive computation
time.Sleep(1 * time.Second)
r := p * 2
cache[p] = r
return r
}
}

func main() {
ExpensiveFuncWithCache := InitExpensiveFuncWithCache()

fmt.Println(ExpensiveFuncWithCache(2))
fmt.Println(ExpensiveFuncWithCache(2))
}

output:
4
from cache
4

veryExpensiveFunctionCached := InitExpensiveFuncWithCache()
并在您的代码中使用包装函数。
你可以试试 here .
如果您希望它可重复使用,请将签名更改为 InitExpensiveFuncWithCache(func(int) int)所以它接受一个函数作为参数。将它包裹在闭包中,用它代替昂贵的计算部分。

关于go - 将缓存添加到 go 函数,就像它是静态成员一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67788292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com