4.go开源cache2go项目笔记——cacheitem文件
1 导入导入的包如下:
import (
"sync"
"time"
)
2 CacheItem结构体该结构是CACHE中的一个ITEM。所以叫做CacheItem.
type CacheItem struct {
sync.RWMutex
keyinterface{}
data interface{}
lifeSpantime.Duration
createdOntime.Time
accessedOntime.Time
accessCountint64
aboutToExpirefunc(key interface{})
}
sync.RWMutex
sync.Mutex 是一个互斥锁,它的作用是守护在临界区入口来确保同一时间只能有一个线程进入临界区。
Key是ITEM的键,是一个接口。
Data是ITEM的数值(也是键值),是一个接口
lifeSpan是CACHE持续时间
createdOn是ITEM创建时间
accessedOn是CACHE最后访问时间
accessCount是访问计数
aboutToExpire是CACHE过期后回调函数。
3 函数CreateCacheItem函数返回:CacheItem
CACHEITEM是上面定义的一个结构体。
入参就是KEY(接口),生命周期,键值(接口)。
4 函数KeepAlive主要是刷新访问时间。
5 函数LifeSpan
获取ITEM的生命长度。
6 函数AccessedOn
返回访问时间
7 函数CreatedOn返回创建时间。
8 函数AccessCount返回访问计数。
9 函数Key返回键。
10 函数Data返回键值。
11 函数SetAboutToExpireCallback当CACHE删除后会被调用的函数。
12 GO语言中interfaceGo 语言不是一种 “传统”的面向对象编程语言:它里面没有类和继承的概念。
但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。
接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。
通过如下格式定义接口:
typeNamer interface {
Method1(param_list) return_type
Method2(param_list) return_type
...
}
上面的 Namer 是一个 接口类型。
(按照约定,只包含一个方法的)接口的名字由方法名加 [e]r 后缀组成,例如 Printer、Reader、Writer、Logger、Converter 等等。还有一些不常用的方式(当后缀 er 不合适时),比如 Recoverable,此时接口名以 able 结尾,或者以 I 开头(像 .NET 或 Java 中那样)。
类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口。
实现某个接口的类型(除了实现接口方法外)可以有其他的方法。
一个类型可以实现多个接口。
接口类型可以包含一个实例的引用,该实例的类型实现了此接口(接口是动态类型)。
12.1 示例代码
packagemain
import"fmt"
typeShaperinterface{
Area()float32
}
typeSquarestruct{
sidefloat32
}
func(sq*Square)Area()float32{
returnsq.side*sq.side
}
funcmain(){
sq1:=new(Square)
sq1.side=5
//varareaIntfShaper
//areaIntf=sq1
//shorter,withoutseparatedeclaration:
//areaIntf:=Shaper(sq1)
//oreven:
areaIntf:=sq1
fmt.Printf("Thesquarehasarea:%f\n",areaIntf.Area())
}
12.2 执行
上面的程序定义了一个结构体 Square
和一个接口 Shaper
,接口有一个方法 Area()
。
在 main()
方法中创建了一个 Square
的实例。在主程序外边定义了一个接收者类型是Square
方法的 Area()
,用来计算正方形的面积:结构体 Square
实现了接口 Shaper
。
所以可以将一个 Square
类型的变量赋值给一个接口类型的变量:areaIntf = sq1
。
现在接口变量包含一个指向 Square
变量的引用,通过它可以调用 Square
上的方法Area()
。当然也可以直接在 Square
的实例上调用此方法,但是在接口实例上调用此方法更令人兴奋,它使此方法更具有一般性。接口变量里包含了接收者实例的值和指向对应方法表的指针。
这是 多态 的 Go 版本,多态是面向对象编程中一个广为人知的概念:根据当前的类型选择正确的方法,或者说:同一种类型在不同的实例上似乎表现出不同的行为。
如果 Square
没有实现 Area()
方法,编译器将会给出清晰的错误信息