中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
黑水县| 蒙阴县| 怀宁县| 措美县| 黄浦区| 文昌市| 宝鸡市| 巴里| 余姚市| 如东县| 谢通门县| 齐齐哈尔市| 信宜市| 梁山县| 兴宁市| 繁峙县| 山东省| 浪卡子县| 永嘉县| 冕宁县| 湾仔区| 集贤县| 静安区| 辉南县| 商洛市| 剑阁县| 肥城市| 阿坝| 宾川县| 上杭县| 台安县| 小金县| 彰武县| 黑山县| 深圳市| 昌图县| 桐柏县| 敖汉旗| 义马市| 达州市| 饶阳县|