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博客