列出包 `MoveToFront` 不适合我

标签 list go

Go 的新手并在 Go 中构建一个简单的 LRU 缓存以习惯语法和 Go 开发。

MoveToFront 列表方法有问题,它在 MoveToFront 正文中的以下检查中失败

if e.list != l || l.root.next == e 

当我从缓存中检索它时,我想将元素 (e) 移动到列表的前面,就像这样

if elem, ok := lc.entries[k]; ok {
    lc.list.MoveToFront(elem) // needs fixing
    return elem
}
return nil

出现问题的代码可以看这里第32行

https://github.com/hajjboy95/golrucache/blob/master/lru_cache/lrucache.go#L32

最佳答案

对我来说似乎有两个问题。首先,这不是 List 数据类型的用途:lc.list.PushFront()创建 List.Element 并返回指向它的指针。这不是致命的,但至少有点烦人——调用者在使用 Get 时必须深入挖掘返回的 List.Element,而不是仅仅获取值.

与此同时,您看到的失败大概是因为当 LRU 列表空间不足时,您在 Put 中删除了元素,但没有从相应的映射中删除它们。因此,稍后对刚刚删除的键的 Put 将尝试在适当的位置重新使用该元素,即使该元素已从列表中删除也是如此。要解决此问题,您需要同时持有键和值。 (在我的简单实验中,我没有看到任何失败,但问题变得很清楚。)

我稍微重组了代码并将其变成了 working example on the Go Playground .我不对适用性等做出任何 promise 。

关于列出包 `MoveToFront` 不适合我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542361/

相关文章:

logging - 堆栈跟踪作为字符串

list - 序言:数字列表

c++ - 在列表中调用子对象

go - golang 是否没有文件结构?

string - GO标志pkg读取包含诸如“\u00FC”之类的转义 rune 的选项字符串将不会读取

postgresql - 扩展 docker postgres 图像以创建额外的数据库

bash - 从 shell 脚本运行 Golang 脚本

list - 如何修复 Haskell 中出现歧义的错误

list - 暂停和恢复对两个列表的迭代?

python - 在列表理解中解包拆分