单例模式Golang实现

在 Golang 中,单例模式可以通过使用包级别的变量或者 sync.Once 来实现

包级别的变量

使用包级别的变量可以实现单例模式,因为在 Go 中,包级别的变量只会被初始化一次,可以保证只有一个实例。例如:

package singleton

type Singleton struct {
    name string
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{name: "singleton"}
    }
    return instance
}

 

在上面的代码中,我们定义了一个 Singleton 结构体和一个 instance 变量作为单例模式的实例。GetInstance 函数用于获取单例模式的实例,如果实例不存在,则创建一个新的实例并返回,否则返回已经存在的实例

 

sync.Once

使用 sync.Once 可以保证只有一个 goroutine 初始化单例模式的实例,从而避免了多线程问题。例如:

package singleton

import "sync"

type Singleton struct {
    name string
}

var instance *Singleton

var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{name: "singleton"}
    })
    return instance
}

 

在上面的代码中,我们使用 sync.Once 来保证只有一个 goroutine 初始化单例模式的实例。在 GetInstance 函数中,我们使用 once.Do 函数来执行初始化操作,如果实例已经被初始化,则不会执行初始化操作

以上两种方式都可以在 Golang 中实现单例模式,具体应该根据实际情况选择

 

posted @ 2023-04-05 13:20  SuperCodeX  阅读(100)  评论(0编辑  收藏  举报