新闻资讯

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻资讯列表

golang单例模式的实现方式有哪几种,golang 单向channel

发布时间:2023-10-31 11:52:42

golang单例模式的实现方式有哪几种

在Go语言中,单例模式可以通过以下几种方式来实现:

  1. 懒汉式: 懒汉式是指在第一次使用时才创建实例。在Go语言中,可使用sync.Once来确保实例只被创建一次。
package singleton

import "sync"

type Singleton struct {}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}
  1. 饿汉式: 饿汉式是指在初始化时就创建实例。在Go语言中,可以在包的init函数中初始化实例。
package singleton

type Singleton struct {}

var instance *Singleton

func init() {
    instance = &Singleton{}
}

func GetInstance() *Singleton {
    return instance
}
  1. 两重检查锁定: 两重检查锁定是指在获得实例时先进行一次检查,如果实例不存在才进行加锁和再次检查。在Go语言中,可使用sync.Mutex和sync.Once来实现。
package singleton

import "sync"

type Singleton struct {}

var instance *Singleton
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {
            instance = &Singleton{}
        }
    }
    return instance
}
  1. sync.Pool: sync.Pool是Go语言提供的一个对象池,可以用来复用对象。在使用sync.Pool时,可以借助sync.Once来实现单例模式。
package singleton

import (
    "sync"
    "time"
)

type Singleton struct {}

var pool sync.Pool
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        pool.New = func() interface{} {
            return &Singleton{}
        }
    })
    return pool.Get().(*Singleton)
}

func (s *Singleton) Put() {
    pool.Put(s)
}

func main() {
    s := GetInstance()
    defer s.Put()
    time.Sleep(time.Second)
}

以上是几种常见的单例模式实现方式,每种方式都有其特点和适用处景,具体选择哪一种方式取决于实际需求。