有时候我们在我们自己的项目中需要实现兼容各种驱动的Cache模型,以便于通过配置更换缓存类型。缓存模型需要支持不同驱动,例如:memory、file、redis、mysql,实现思路代码如下:cache。go文件,定义缓存对外接口模型代码可以自定义扩展驱动类型默认是memorydriverpackagecacheimport(。driver)cache接口声明typeCacherinterface{GetStorage()driver。ContainererSet(kstring,vinterface{})Get(kstring)(interface{},bool)Del(kstring)Has(kstring)bool}creatememorycachetypefileormemoryfuncNewcache(cacheTypestring)Cacher{switchcacheType{casememory:returndriver。CacheImpl{Driver:driver。NewMapContainer()}casefile:{returndriver。CacheImpl{Driver:driver。NewFileContainer()}}casemysql:{returndriver。CacheImpl{Driver:driver。NewMysqlContainer()}}caseredis:{returndriver。CacheImpl{Driver:driver。NewRedisContainer()}}casemongodb:{returndriver。CacheImpl{Driver:driver。NewMongoContainer()}}}returnnil}driver。go实现驱动,这里我只利用Map实现了,具体其他驱动可自行实现可以自定义扩展驱动类型默认是memorycachepackagedriver容器接口声明typeContainererinterface{PushKVPair(k,vinterface{})ContainererEraseKVPair(kinterface{})ContainererPushKVMaps(maps。。。map〔string〕interface{})ContainererResetKVPair(kstring,vinterface{})ContainererResetOrAddKVPair(kstring,vinterface{})ContainererResetKVPairs(kvMapsmap〔string〕interface{})ContainererResetOrAddKVPairs(kvMapsmap〔string〕interface{})ContainererExist(kinterface{})boolGetData()map〔string〕interface{}}基于内存实现的缓存typeCacheImplstruct{DriverContainerer数据缓存驱动}func(selfCacheImpl)Exist(kinterface{})bool{returnself。Driver。Exist(k)}func(selfCacheImpl)GetStorage()Containerer{returnself。Driver}setfunc(selfCacheImpl)Set(kstring,vinterface{}){self。Driver。PushKVPair(k,v)}getfunc(selfCacheImpl)Get(kstring)(interface{},bool){mapData:self。Driver。GetData()val,ok:mapData〔k〕returnval,ok}erasefunc(selfCacheImpl)Del(kstring){self。Driver。EraseKVPair(k)}hasfunc(selfCacheImpl)Has(kstring)bool{mapData:self。Driver。GetData(),ok:mapData〔k〕returnok}Map实现的内存驱动typeMapContainerstruct{datamap〔string〕interface{}}创建数据channerfuncNewMapContainer()MapContainer{returnMapContainer{data:make(map〔string〕interface{})}}func(thisMapContainer)PushKVPair(k,vinterface{})Containerer{ifkey,ok:k。(string);!ok{panic(key必须是string类型!)}else{this。data〔key〕v}returnthis}func(thisMapContainer)Exist(kinterface{})bool{returntrue}func(thisMapContainer)EraseKVPair(kinterface{})Containerer{ifkey,ok:k。(string);!ok{panic(key必须是string类型!)}else{delete(this。data,key)}returnthis}func(thisMapContainer)PushKVMaps(maps。。。map〔string〕interface{})Containerer{for,itemMap:rangemaps{foritemKey,itemValue:rangeitemMap{this。PushKVPair(itemKey,itemValue)}}returnthis}func(thisMapContainer)ResetKVPair(kstring,vinterface{})Containerer{if,ok:this。data〔k〕;ok{this。data〔k〕v}returnthis}func(thisMapContainer)ResetOrAddKVPair(kstring,vinterface{})Containerer{this。data〔k〕vreturnthis}func(thisMapContainer)ResetKVPairs(kvMapsmap〔string〕interface{})Containerer{fork,v:rangekvMaps{if,ok:this。data〔k〕;ok{this。data〔k〕v}}returnthis}func(thisMapContainer)ResetOrAddKVPairs(kvMapsmap〔string〕interface{})Containerer{fork,v:rangekvMaps{this。data〔k〕v}returnthis}func(thisMapContainer)GetData()map〔string〕interface{}{returnthis。data} 到此一个基础Memory类型的驱动就构建完成,我们也可以通过这个模型去构建redis、mysql等等驱动实现自定义缓存。