golang实现单例模式(golang单例模式 范型)

什么是单例模式?

单例模式是一种设计模式,其目的是确保一个类只能创建一个实例,并提供全局访问点。这种模式适用于需要确保在整个应用程序中只创建一个实例的场景。 在golang中实现单例模式非常容易。

实现单例模式的方法

Golang中实现单例模式有多种方法:

  1. 使用私有变量与公开方法,内存占用少,但是在高并发下可能存在并发问题
  2. 使用sync.Once库可以避免Highlander效应经典问题
  3. Go语言中,还可以使用双重检查锁(Double Checked Locking)机制实现单例模式。双重检查锁机制的实现方法是在锁定之前进行一次检查,这样,只有在需要的情况下才会对锁进行加锁。

使用sync.Once库实现单例模式

使用sync.Once库可以避免Highlander效应经典问题,因为它是线程安全的。我们只需要在代码中定义一个公共变量,在第一次调用变量时初始化它。一旦变量被初始化,将不再需要进一步的锁定。

// singleton.go
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
}

在main.go文件中,我们将使用GetInstance函数获取单例对象并打印其名称。我们不需要使用任何锁,因为GetInstance已确保了在同一时间只有一个线程可以访问函数内部。

// main.go
package main

import (
    "fmt"
    "github.com/xxx/singleton"
)

func main() {
    s1 := singleton.GetInstance()
    s2 := singleton.GetInstance()

    if s1 == s2 {
        fmt.Println("Same instance")
    } else {
        fmt.Println("Different instances")
    }
    
    fmt.Printf("%p\n", s1)
    fmt.Printf("%p\n", s2)
    fmt.Println(s1 == s2) // true
}

运行main.go文件,您将获得以下输出。

Same instance
0x1d5de80
0x1d5de80
true

以上是使用sync.Once库实现单例模式的方法。您还可以使用其他方法来实现单例模式,但最后结果必须是一个全局唯一的实例。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/golang-g3l.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年5月2日 上午1:50
下一篇 2023年5月2日 上午1:50

猜你喜欢