一尘不染

单身人士去

go

如何使用go编程语言实现Singleton设计模式?


阅读 170

收藏
2020-07-02

共1个答案

一尘不染

撇开是否实现单例模式的观点不谈,以下是一个可能的实现:

package singleton

type single struct {
        O interface{};
}

var instantiated *single = nil

func New() *single {
        if instantiated == nil {
                instantiated = new(single);
        }
        return instantiated;
}

single并且instantiated是私人的,但是New()公开的。因此,你不能直接实例single没有经历New(),和它跟踪实例的数量与私人布尔instantiated。调整single口味的定义。

但是,正如其他几个人指出的那样,这不是线程安全的,除非您仅在中初始化单例init()。更好的方法是利用sync.Once您的辛勤工作:

package singleton

import "sync"

type single struct {
        O interface{};
}

var instantiated *single
var once sync.Once

func New() *single {
        once.Do(func() {
                instantiated = &single{}
        })
        return instantiated
}

另请参见,hasan j的建议只是将包 视为 单例。最后,请考虑其他人的建议:单例通常是存在问题的指示。

2020-07-02