1. package main
  2.  
  3. type LRUNode struct {
  4. key string
  5. val interface{}
  6. prev *LRUNode
  7. next *LRUNode
  8. }
  9.  
  10. type LRU struct {
  11. dataMap map[string]*LRUNode
  12. head *LRUNode
  13. tail *LRUNode
  14. capacity int
  15. count int
  16. }
  17.  
  18. func NewLRU(capacity int)LRU{
  19. head := &LRUNode{}
  20. tail := &LRUNode{}
  21. head.next = tail
  22. tail.prev = head
  23. return LRU{head:head,tail:tail,capacity:capacity,count:0,dataMap:make(map[string]*LRUNode)}
  24. }
  25.  
  26. func (L *LRU)Get(key string)interface{} {
  27. v,ok:=L.dataMap[key]
  28. if !ok {
  29. return nil
  30. }
  31. //detach node
  32. L.detachNode(v)
  33. //insert first
  34. L.insertFront(v)
  35. return v.val
  36. }
  37. func (L *LRU)detachNode(node *LRUNode) {
  38. node.prev.next = node.next
  39. node.next.prev = node.prev
  40. }
  41. func (L *LRU)insertFront(node *LRUNode) {
  42. node.next = L.head.next
  43. L.head.next = node
  44. node.prev = L.head
  45. }
  46.  
  47. func (L *LRU)delLast(){
  48. tmp:=L.tail.prev
  49. tmp.prev.next = L.tail
  50. L.tail.prev = tmp.prev
  51. tmp.next = nil
  52. tmp.prev = nil
  53. L.count = L.count-1
  54. delete(L.dataMap,tmp.key)
  55. }
  56. func (L *LRU)Set(key string,val interface{}){
  57. v,ok :=L.dataMap[key]
  58. if !ok {
  59. node :=&LRUNode{key:key,val:val}
  60. if L.count==L.capacity{
  61. L.delLast()
  62. }
  63. L.dataMap[key] = node
  64. L.insertFront(node)
  65. L.count = L.count+1
  66. }else {
  67. L.detachNode(v)
  68. L.insertFront(v)
  69. }
  70. } 

---------------------
作者:qingxili
来源:CSDN
原文:https://blog.csdn.net/qingxili/article/details/79870601
版权声明:本文为博主原创文章,转载请附上博文链接!

golang实现LRU,转载学习的更多相关文章

  1. golang日志框架--logrus学习笔记

    golang日志框架--logrus学习笔记 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数,对于更精细的日志级别.日志文件分割以及日志分发等方面并没有提供 ...

  2. [goa]golang微服务框架学习--安装使用

      当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...

  3. golang 关于 interface 的学习整理

    Golang-interface(四 反射) go语言学习-reflect反射理解和简单使用 为什么在Go语言中要慎用interface{} golang将interface{}转换为struct g ...

  4. [Golang][Mac]Go 语言学习资料记录

    背景:最近的项目开发语言是GOlang 因此需要做一些简单了解和学习记录 又可以学习一下Google的新语言了,想想有些小激动哦~ 官方网站(需翻墙才能打开,比如用蓝灯)https://golang. ...

  5. 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误

    我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...

  6. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(转载 学习中。。。)

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  7. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  8. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...

  9. JS重要知识点(转载 学习中。。。)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

随机推荐

  1. python 枚举类

    枚举类 Enum类 from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Ju ...

  2. php curl 总结

    1 curl post curl -X POST http://localhost/ -d  '{"data":{"name":"hheh" ...

  3. Jenkins安装 CentOS 7上安装Jenkins

    CentOS 7上安装Jenkins Jenkins 安装 只安装不介绍 步骤1:更新CentOS 7 Linux系统管理员的最佳做法之一是使系统保持最新.安装最新的稳定包,然后重新启动.   1 2 ...

  4. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.2.HotSpot虚拟机对象探秘

    对象的创建过程 1.加载类 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载. 解析和初始化过. 如果没有,那必须 ...

  5. maven仓库使用HTTP代理,maven仓库使用本地jar

    setting.xml <proxies> <proxy> <id>proxy</id> <active>true</active&g ...

  6. mysql 查询大量数据报错

    错误:Incorrect key file for table '/tmp/#sql_... 由于一次查询出大量数据,并且使用了临时表,导致产生此错误,主要是存放临时表文件的/tmp目录大小不足导致.

  7. 服务容错处理库Polly使用

    服务容错处理库Polly使用 在进入SOA之后,我们的代码从本地方法调用变成了跨机器的通信.任何一个新技术的引入都会为我们解决特定的问题,都会带来一些新的问题.比如网络故障.依赖服务崩溃.超时.服务器 ...

  8. codeforces 814 C. An impassioned circulation of affection 【尺取法 or DP】

    //yy:因为这题多组数据,DP预处理存储状态比每次尺取快多了,但是我更喜欢这个尺取的思想. 题目链接:codeforces 814 C. An impassioned circulation of ...

  9. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

  10. Gluon Data API

    http://mxnet.apache.org/api/python/gluon/data.html import sys import os import time import mxnet as ...