Go语言单例模式

2023/03/24

Tags: Go

错误示例

type singleton struct {}

var instance *singleton

func GetInstance() *singleton {
    if instance == nil {
        instance = &singleton{}   // 不是并发安全的
    }
    return instance
}

不优雅示例

func GetInstance() *singleton {
    mu.Lock()                    // 如果实例存在没有必要加锁
    defer mu.Unlock()

    if instance == nil {
        instance = &singleton{}
    }
    return instance
}

加锁可以保证每次拿到相同实例,但是如果已经实例化,再调用函数,依然有锁存在,浪费性能,不够优雅;

优雅示例

import (
    "sync"
)

type singleton struct {}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

该实现利用sync.Once类型去同步对GetInstance()的访问,并确保我们的类型仅被初始化一次。