91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

golang單例模式的實現方式有哪些

小億
86
2023-10-31 11:52:42
欄目: 編程語言

在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)
}

以上是幾種常見的單例模式實現方式,每種方式都有其特點和適用場景,具體選擇哪種方式取決于實際需求。

0
平罗县| 民勤县| 连云港市| 乐昌市| 襄城县| 陇南市| 乐山市| 桐城市| 镇安县| 南京市| 英山县| 蓝田县| 健康| 萍乡市| 江华| 顺义区| 齐齐哈尔市| 双辽市| 长泰县| 平阴县| 安阳市| 应城市| 渑池县| 五河县| 阳城县| 沐川县| 招远市| 通道| 彩票| 泸州市| 苏尼特左旗| 冀州市| 平昌县| 乌拉特中旗| 象州县| 涡阳县| 敦煌市| 永年县| 上饶县| 湖北省| 益阳市|