当前位置: 首页 > news >正文

长沙营销型网站开发腾讯广告推广怎么做

长沙营销型网站开发,腾讯广告推广怎么做,净水器 技术支持 东莞网站建设,小米路由 做网站和许多面向对象的编程语言一样,Golang也存在interface接口这样的概念。interface相当于是一个中间层,下游只需要关心interface实现了什么行为,利用这些行为做些业务级别事情,而上游则负责实现interface,把这些行为具象…

和许多面向对象的编程语言一样,Golang也存在interface接口这样的概念。interface相当于是一个中间层,下游只需要关心interface实现了什么行为,利用这些行为做些业务级别事情,而上游则负责实现interface,把这些行为具象化。本文就来通过一个简单的缓存cache模块的实现,来示范一下Golanginterface该怎么用。

首先,从业务service角度而言,一个cache模块可能需要以下几种方法:

  • 获取缓存中的某个值
  • 缓存数据,加缓存时效
  • 删除缓存内容

那么这些个方法,就可以用一类叫Cacheinterface来表示:

type Cache interface {Get(key string) (interface{}, bool)Set(key string, value interface{})SetExpire(key string, value interface{}, expire time.Duration)Delete(key string)
}

其中,Get方法返回一个interface{}value,以及是否存在的bool标识;SetSetExpire表示无时限跟有时限的缓存行为;Delete表示删除缓存内容。整块Cache的接口定义也非常明显。

这样写有什么好处?如果你是下游业务服务的话,你只需要这样写就可以了。这里给一个同package下的测试用例代码:

func TestCache(t *testing.T) {k, v := "hello", "world"// Current()的实现,在下文慢慢解释var curCache Cache = Current()// set & get & deletecurCache.Set(k, v)cached, ok := curCache.Get(k)if !ok {t.Fatalf("cannot cache %s:%s", k, v)} else {t.Logf("got cached %s:%v (type: %s)", k, cached, reflect.TypeOf(cached).Name())}curCache.Delete(k)_, ok = curCache.Get(k)if ok {t.Fatalf("cannot delete %s:%s", k, v)} else {t.Logf("delete cached %s:%s", k, v)}// set expirecurCache.SetExpire(k, v, 1*time.Second)cached, ok = curCache.Get(k)if !ok {t.Fatalf("cannot cache %s:%s", k, v)} else {t.Logf("got cached %s:%v (type: %s)", k, cached, reflect.TypeOf(cached).Name())}time.Sleep(3 * time.Second)_, ok = curCache.Get(k)if ok {t.Fatalf("cannot expire %s:%s", k, v)} else {t.Logf("expired %s:%s", k, v)}
}

可以看到,我们指定的缓存对象curCache标识为一个Cache,是个接口定义,这样标识起来的话,下面的代码就可以正常使用GetSet之类的方法了。而更重要的是,下面的代码,不会因为Cache的具体实现变化而有所变化。举个例子,你有10个开源的缓存库,想定时切换Current() Cache背后的缓存对象实现,就算你再怎么换,只要用到缓存的代码标注缓存对象为Cache这个interface,并且interface的定义没有变化,那么使用缓存的代码就不需要动。这样,就彻底实现了缓存提供方和使用方的解耦,开发效率也会噌噌噌的上去。

既然提到了提供方Provider的概念,那在缓存的实现上,就可以走依赖注入控制反转的模式。假设某个Web服务有个本地缓存模块,在实现上,就可以考虑提供多个Cache接口的实现,同时在配置里指定默认的一种。这里,就以go-cache为例,做一个实现案例。

import ("github.com/patrickmn/go-cache""time"
)const (GoCacheDefaultExpiration = 10 * time.MinuteGoCacheCleanupInterval   = 15 * time.Minute
)type GoCache struct {c *cache.CachedefaultExpiration time.DurationcleanupInterval   time.Duration
}func (g *GoCache) Get(key string) (interface{}, bool) {return g.c.Get(key)
}func (g *GoCache) Set(key string, value interface{}) {g.c.Set(key, value, GoCacheDefaultExpiration)
}func (g *GoCache) SetExpire(key string, value interface{}, expire time.Duration) {if expire < 0 {expire = g.defaultExpiration}if expire > g.cleanupInterval {expire = g.cleanupInterval}g.c.Set(key, value, expire)
}func (g *GoCache) Delete(key string) {g.c.Delete(key)
}func NewGoCache() *GoCache {return &GoCache{c: cache.New(GoCacheDefaultExpiration, GoCacheCleanupInterval),defaultExpiration: GoCacheDefaultExpiration,cleanupInterval:   GoCacheCleanupInterval,}
}

当我们定义一个GoCachestruct,实现了Cache接口定义的所有行为,那么GoCache的实例,在Golang里,就能够被标识为一个Cache接口实例。NewGoCache方法,不仅是提供了一个GoCache的实例,而在业务层面,更是提供了一个Cache实例。因此,我们可以简单用一个map来管理所有的Cache的构造器,从而标识不同的缓存实现:

func provideGoCache() Cache {return NewGoCache()
}var cacheProviders = map[string]Cache{"go-cache": provideGoCache(),
}const (DefaultCacheProvider = "go-cache"
)func Get(provider string) Cache {c, ok := cacheProviders[provider]if !ok {return nil}return c
}func Default() Cache {return Get(DefaultCacheProvider)
}// 上文提到的样例代码,就用了这个方法拿到go-cache实现的Cache接口实例
func Current() Cache {return Default()
}

显而易见,通过这样的一个代码组织,不论是go-cache,抑或是其它的Cache实现,都可以集中管理并灵活取用。这,便是interfaceGolang编程中给我们带来的便利了。

http://www.hkea.cn/news/435748/

相关文章:

  • 网络推广seo公司seo排名的方法
  • 南山做网站多少钱百度资讯
  • 西安哪里有做网站的小学生收集的新闻10条
  • 做游戏网站有几个要素seo网站关键词优化报价
  • 蓬业东莞网站建设技术支持东莞做网站公司首选
  • 网站版式设计获客渠道有哪些
  • 今日军事新闻简短扬州seo优化
  • 国外好看的教育类网站模板下载东莞做网站最好的是哪家
  • 微擎与wordpress快速优化seo软件推广方法
  • 英文网站设计哪家好免费网站搭建
  • 网站建设公司 销量深圳谷歌seo公司
  • 新蔡哪有做网站建设的全球疫情今天最新消息
  • 怎么做平台网站百度seo报价方法
  • 帮人做网站 怎么收费怎么用网络推广
  • 网站排名优化建设百度广告投放技巧
  • 文件服务器网站搭建教程好的竞价托管公司
  • 黑龙江省城乡和住房建设厅网站首页百度链接地址
  • 网站模板修改工具专业seo关键词优化
  • 口碑好的句容网站建设yahoo搜索
  • 深圳网站建设外贸公司价格网络营销的背景和意义
  • 长春网站建设硕成传媒seo快速排名优化公司
  • web网站开发能使用c 吗免费建立个人网站申请
  • 织梦网站修改教程视频网站优化培训学校
  • 南沙区交通和建设局网站中国十大网络销售公司
  • 免费建设网站的方法百度网址大全 官网
  • 手机网站设计制作公司微信推广费用一般多少
  • 建设网站需要什么注册域名费用一般多少钱
  • 女性门户网站源码百度指数功能有哪些
  • 怎么帮公司做网站建设谷歌搜索引擎免费入口 香港
  • 请写出网站建设前期需要做的准备外贸定制网站建设电话