Go设计模式(一)单例模式

69 阅读1分钟

sync.Once

实际上golang标准库里的sync.Once就是采用atomic实现的双重检查锁,所以golang里的最佳实践是直接使用sync.Once

type Singleton struct {
    A int64
}

var ins *Singleton
var once sync.Once

func main() {
    fmt.Println("start ", ins)
    getInstance(1)
    fmt.Println("1 : ", ins)
    getInstance(3)
    fmt.Println("3 : ", ins)
}

func getInstance(a int64) {
    once.Do(func() {
       fmt.Println("once")
       ins = &Singleton{A: a}
    })
}

输出结果

start  <nil>
once
1 :  &{1}
3 :  &{1}