Go中的单例实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go中的单例实现相关的知识,希望对你有一定的参考价值。
我有一个结构:
type cache struct {
cap int
ttl time.Duration
items map[interface{}]*entry
heap *ttlHeap
lock sync.RWMutex
NoReset bool
}
它实现的接口:
type Cache interface {
Set(key, value interface{}) bool
Get(key interface{}) (interface{}, bool)
Keys() []interface{}
Len() int
Cap() int
Purge()
Del(key interface{}) bool
}
函数返回单例:
func Singleton() (cache *Cache) {
if singleton != nil {
return &singleton
}
//default
singleton.(cache).lock.Lock()
defer singleton.(cache).lock.Unlock()
c := New(10000, WithTTL(10000 * 100))
return &c
}
我不确定哪种类型应该是我的singleton
:
- 当
var singleton cache
我不能检查零 - 如果
var singleton Cache
我不能施放到singleton.(cache).lock.Lock()
O得到错误:cache is not a type
如何以正确的方式在Go中编写goroutine-safe Singleton?
答案
使用sync.Once懒惰地初始化单例值:
var (
singleton Cache
once sync.Once
)
func Singleton() Cache {
once.Do(func() {
singleton = New(10000, WithTTL(10000*100))
})
return singleton
}
如果可以在程序启动时初始化,那么执行以下操作:
var singleton Cache = New(10000, WithTTL(10000*100))
func Singleton() Cache {
return singleton
}
以上是关于Go中的单例实现的主要内容,如果未能解决你的问题,请参考以下文章