假设我有一个昂贵的功能
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中模拟静态成员缓存的好方法是什么?
4条答案
按热度按时间oprakyz71#
您可以使用闭包,并让闭包管理该高速缓存。
字符串
并在代码中使用wrapped函数。您可以尝试here。
如果你希望它是可重用的,将签名改为
InitExpensiveFuncWithCache(func(int) int)
,这样它就可以接受一个函数作为参数。j8ag8udp2#
如果这个缓存将在http处理程序中使用,你需要小心同步。在Go标准库中,每个http请求都在一个专用的goroutine中处理,目前我们处于并发和竞争条件的领域。我建议使用RWMutex来确保数据一致性。
至于该高速缓存注入,可以在创建http处理程序的函数中注入。
字符串
ipakzgxi3#
Go标准库使用以下样式来提供“静态”函数(例如flag.CommandLine),但这些函数利用了底层状态:
字符串
这种设计模式不仅允许简单的一次性使用,还允许隔离使用:
型
yx2lnoni4#
你可以写一个生成器来创建一个cacheMap。
就像这样:
字符串
使用这个生成器像这样:
型
下面是一个例子:https://go.dev/play/p/guzOWRKi-yp
下一篇:github test