4 Get函数
入参为key类型为Key。返回value和是否ok.
如果不存在缓存则直接换回。
如果存在就意味着命中,将元素指针移到列表前面,然后返回元素和TRUE
5 Remove函数
如果缓存不存在,则直接返回。
如果存在,调用removeElement移除指针。
6 RemoveOldest函数
如果缓存不存在,则直接返回。
如果有缓存则调用removeElement从列表的后端开始删除。
7 removeElement函数
入参为列表指针。
直接调用列表的Remove函数删除指针。
然后使用delete命令从map(c.cache)中删除对应的项
如果有回调函数则调用回调函数。
8 Len函数
返回列表长度,如果Cache结构体中的map为nil直接返回0.
PS:Go中实现一个类的成员方法,在func之后加类,在Go中接口的实现并不是和Java中那样子,而是只要某个类只要实现了某个接口的所有方法,即可认为该类实现了该接口。
Go中开头字母大写的变量名,类名,方法名表示对外可知,小写开头的表示对外不暴露。另外类实这种代码ele.Value.(*entry).value,其中(*entry)表示将Value转成*entry类型访问。
9 LRU_TESET
用于测试lru。
定义了两个结构体simpleStruct,complexStruct
然后定义一个变量getTests,如下
vargetTests=[]struct{
name string
keyToAdd interface{}
keyToGet interface{}
expectedOkbool
}{
{"string_hit","myKey","myKey",true},
{"string_miss","myKey","nonsense",false},
{"simple_struct_hit",simpleStruct{1,"two"},simpleStruct{1,"two"},true},
{"simeple_struct_miss",simpleStruct{1,"two"},simpleStruct{0,"noway"},false},
{"complex_struct_hit",complexStruct{1,simpleStruct{2,"three"}},
complexStruct{1,simpleStruct{2,"three"}},true},
}
主要是两个用例如下
9.1 TestGet
从变量getTests循环获取,先调用New创建一个lru.
然后根据getTests. keyToAdd来增加缓存。每个键值都为1234.
然后在增加完后进行获取键值是否满足条件。
循环结束后测试也结束。
9.2 TestRemove
先增加一个lru。
然后增加一个键值,测试OK
然后将键值删除。检查删除是否成功。
9.3 测试结果
=== RUN TestGet
--- PASS: TestGet (0.00s)
=== RUN TestRemove
--- PASS: TestRemove(0.00s)
PASS
ok test 0.135s
本文来自:CSDN博客