4.go开源cache2go项目笔记——cacheitem文件
2017-09-26 21:58
232 查看
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
函数返回:CacheItemCACHEITEM是上面定义的一个结构体。
入参就是KEY(接口),生命周期,键值(接口)。
4 函数KeepAlive
主要是刷新访问时间。5 函数LifeSpan
获取ITEM的生命长度。6 函数AccessedOn
返回访问时间7 函数CreatedOn
返回创建时间。8 函数AccessCount
返回访问计数。9 函数Key
返回键。10 函数Data
返回键值。11 函数SetAboutToExpireCallback
当CACHE删除后会被调用的函数。12 GO语言中interface
Go 语言不是一种 “传统”的面向对象编程语言:它里面没有类和继承的概念。但是 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 示例代码
packagemainimport"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()方法,编译器将会给出清晰的错误信息
相关文章推荐
- 3.go开源cache2go项目笔记——cachetable文件
- 7.go开源cache2go项目笔记——benchmark_test文件
- 5.go开源cache2go项目笔记——cache文件
- 8.go开源cache2go项目笔记——callbacks调用
- 9.go开源cache2go项目笔记——dataloader调用
- 10.go开源cache2go项目笔记——mycachedapp调用
- go开源cache2go项目蛤蟆笔记——简单使用-
- 1.go开源cache2go项目笔记——简单使用-
- 6.go开源cache2go项目笔记——cache_test文件
- 2.go开源cache2go项目笔记——项目介绍
- 9.go开源groupcache项目笔记——lru代码
- IOS开源项目Coding学习笔记(4):SVWebViewController: 服务条款界面
- ETL学习笔记之四:开源项目 Kettle(转)
- Google 开源项目风格指南阅读笔记(C++版)
- ETL学习笔记之四:开源项目 Kettle - 石头记 - CSDNBlog
- Android(java)学习笔记207:开源项目使用之gif view
- jiecaovideo开源项目笔记-JCVideoPlayer小修改
- 【JAVA学习笔记】总结学习J2EE中一些值得研究的开源项目(转)
- Android笔记——导入Github开源项目CircleRefreshLayout
- 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)