什么是单例模式?
单例模式是一种设计模式,其目的是确保一个类只能创建一个实例,并提供全局访问点。这种模式适用于需要确保在整个应用程序中只创建一个实例的场景。 在golang中实现单例模式非常容易。
实现单例模式的方法
Golang中实现单例模式有多种方法:
- 使用私有变量与公开方法,内存占用少,但是在高并发下可能存在并发问题
- 使用sync.Once库可以避免Highlander效应经典问题
- 在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小时之内反馈信息。
如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!