亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

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
巩留县| 前郭尔| 衡阳市| 岑巩县| 云南省| 宝兴县| 新巴尔虎左旗| 安溪县| 辽中县| 拜城县| 扶绥县| 常山县| 芷江| 吉安市| 奇台县| 城固县| 女性| 德保县| 普陀区| 舞钢市| 普定县| 类乌齐县| 安泽县| 瑞昌市| 莒南县| 鹤山市| 古蔺县| 泌阳县| 余干县| 垣曲县| 连南| 太保市| 柞水县| 弥渡县| 晋中市| 婺源县| 新泰市| 望江县| 和林格尔县| 巴彦淖尔市| 威信县|