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

  1. var singleton cache我不能检查零
  2. 如果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中的单例实现的主要内容,如果未能解决你的问题,请参考以下文章

Go语言中的单例模式

Go语言实现单例的正确姿势

性能比较好的单例写法

Python中的单例模式——装饰器实现剖析

实现接口的单例类[重复]

多线程中的单例模式可能具有重复代码