golang实现LRU,转载学习
package main type LRUNode struct {
key string
val interface{}
prev *LRUNode
next *LRUNode
} type LRU struct {
dataMap map[string]*LRUNode
head *LRUNode
tail *LRUNode
capacity int
count int
} func NewLRU(capacity int)LRU{
head := &LRUNode{}
tail := &LRUNode{}
head.next = tail
tail.prev = head
return LRU{head:head,tail:tail,capacity:capacity,count:0,dataMap:make(map[string]*LRUNode)}
} func (L *LRU)Get(key string)interface{} {
v,ok:=L.dataMap[key]
if !ok {
return nil
}
//detach node
L.detachNode(v)
//insert first
L.insertFront(v)
return v.val
}
func (L *LRU)detachNode(node *LRUNode) {
node.prev.next = node.next
node.next.prev = node.prev
}
func (L *LRU)insertFront(node *LRUNode) {
node.next = L.head.next
L.head.next = node
node.prev = L.head
} func (L *LRU)delLast(){
tmp:=L.tail.prev
tmp.prev.next = L.tail
L.tail.prev = tmp.prev
tmp.next = nil
tmp.prev = nil
L.count = L.count-1
delete(L.dataMap,tmp.key)
}
func (L *LRU)Set(key string,val interface{}){
v,ok :=L.dataMap[key]
if !ok {
node :=&LRUNode{key:key,val:val}
if L.count==L.capacity{
L.delLast()
}
L.dataMap[key] = node
L.insertFront(node)
L.count = L.count+1
}else {
L.detachNode(v)
L.insertFront(v)
}
}
---------------------
作者:qingxili
来源:CSDN
原文:https://blog.csdn.net/qingxili/article/details/79870601
版权声明:本文为博主原创文章,转载请附上博文链接!
golang实现LRU,转载学习的更多相关文章
- golang日志框架--logrus学习笔记
golang日志框架--logrus学习笔记 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数,对于更精细的日志级别.日志文件分割以及日志分发等方面并没有提供 ...
- [goa]golang微服务框架学习--安装使用
当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...
- golang 关于 interface 的学习整理
Golang-interface(四 反射) go语言学习-reflect反射理解和简单使用 为什么在Go语言中要慎用interface{} golang将interface{}转换为struct g ...
- [Golang][Mac]Go 语言学习资料记录
背景:最近的项目开发语言是GOlang 因此需要做一些简单了解和学习记录 又可以学习一下Google的新语言了,想想有些小激动哦~ 官方网站(需翻墙才能打开,比如用蓝灯)https://golang. ...
- 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误
我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(转载 学习中。。。)
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...
- JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)
(转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...
- Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)
转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...
- JS重要知识点(转载 学习中。。。)
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
随机推荐
- HTML5新增功能
HTML5日期输入类型(date) 1.HTML5规范里只规定date新型input输入类型 HTML5里的dateinput类型给了给了浏览器实现原生日历的机会,从此之后,JavaScript版的日 ...
- ubuntu16.4安装php7+apache2+mysql环境全过程记录
1.安装apache2 sudo apt-get install apache2 2.安装php7 sudo apt-get install php7.0 3.apache 识别php插件(不是必须, ...
- java中的泛型2--注意的一些问题和面试题
前言 这里总结一下泛型中需要注意的一些地方和面试题,通过面试题可以让你掌握的更清楚一些. 泛型相关问题 1.泛型类型引用传递问题 在Java中,像下面形式的引用传递是不允许的: ArrayList&l ...
- oracle 10g将数据导入到指定表空间的步骤
--创建临时表空间 create temporary tablespace yhtemp tempfile 'D:/oracle/oradata/Oracle10g/yhtemp.dbf' size ...
- 正则工具类 -- RegexUtils
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util. ...
- Yii 验证和消息
setFlash(), getFlash()可以完成验证成功后提示 <?php # 成功信息提示 Yii::app()->user->setFlash('success', &quo ...
- Spark Streamming 基本输入流(二) :Socket
Spark Streamming 可以通过socket 进行数据监听. socket的输入方可以通过nc 或者自己开发nc功能的程序. 1.系统自带的nc su root a yum install ...
- 关于Git提交规范
自古至今,无规矩不成方圆. Git提交也有其规范,业内做的比较好的,比较具有参考价值的就是Angular的提交. Angular提交规范: <type>(<scope>): & ...
- C# 文件流FileStream 实现多媒体文件复制 StreamReader StreamWriter 读取写入文本
#region 实现多媒体文件的复制 string source = @"F:\123\source.avi";//源文件路径 string target = @"F:\ ...
- Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决
Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...