手撕单例模式

在Go语言中实现单例模式,通常需要确保一个类只有一个实例,并且提供一个全局访问点。Go语言本身没有类的概念,但可以通过结构体和函数来模拟这种行为。下面是一个简单的手撕单例模式的实现示例:

懒汉式(延迟初始化)

懒汉式单例模式会在第一次调用时创建实例,适用于可能不会被使用的场景。

go 复制代码
package singleton

import "sync"

// Singleton 是我们希望只创建一次的对象。
type Singleton struct {
    // 可以在这里添加需要的数据成员
}

var (
    instance *Singleton
    once     sync.Once
)

// GetInstance 提供了一个全局访问点,用于获取Singleton的唯一实例。
func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

在这个实现中:

  • sync.Once 保证了 Do 方法内的代码块只会被执行一次。sync.Once 的零值(默认值)就是一个已经准备好使用的 sync.Once 实例
  • instanceSingleton 结构体的一个指针,用于保存唯一的实例。
  • GetInstance 函数是全局访问点,用来获取唯一的 Singleton 实例。

饿汉式(立即初始化)

饿汉式单例模式会在程序启动时就创建实例,适用于一定会被使用的场景。

go 复制代码
package singleton

// Singleton 是我们希望只创建一次的对象。
type Singleton struct {
    // 可以在这里添加需要的数据成员
}

// 声明并初始化唯一的Singleton实例
var instance = &Singleton{}

// GetInstance 提供了一个全局访问点,用于获取Singleton的唯一实例。
func GetInstance() *Singleton {
    return instance
}

在这个实现中:

  • instance 在包初始化阶段就已经创建好了。
  • GetInstance 函数返回这个已经存在的实例。

使用示例

无论采用哪种方式,你都可以这样使用单例模式:

go 复制代码
package main

import (
    "fmt"
    "singleton"  // 假设上面的代码位于名为singleton的包中
)

func main() {
    // 获取Singleton的实例
    s1 := singleton.GetInstance()
    s2 := singleton.GetInstance()

    // 检查两个引用是否指向同一个对象
    if s1 == s2 {
        fmt.Println("s1 and s2 are the same instance")
    } else {
        fmt.Println("s1 and s2 are different instances")
    }
}

这段代码会输出 s1 and s2 are the same instance,表明单例模式正确地工作了。

注意事项

  • 并发安全 :在多线程环境下,懒汉式的实现必须保证线程安全。上述例子中的 sync.Once 已经提供了这样的保证。
  • 性能考虑:如果初始化代价很高,懒汉式可以延迟到实际需要时才进行初始化;而饿汉式则会在程序启动时就完成初始化。
  • 资源管理:如果你的单例持有某些资源(如数据库连接),需要确保这些资源在不再需要时能够正确释放。
相关推荐
TTGGGFF2 小时前
Supertonic 部署与使用全流程保姆级指南(附已部署镜像)
开发语言·python
木木木一2 小时前
Rust学习记录--C7 Package, Crate, Module
开发语言·学习·rust
love530love2 小时前
升级到 ComfyUI Desktop v0.7.0 版本后启动日志报 KeyError: ‘tensorrt‘ 错误解决方案
开发语言·windows·python·pycharm·virtualenv·comfyui·comfyui desktop
Evand J3 小时前
【MATLAB例程】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,附MATLAB代码下载链接
开发语言·matlab·无人机·无人车·uav·协同定位·ugv
chao1898443 小时前
基于MATLAB实现多变量高斯过程回归(GPR)
开发语言·matlab·回归
ytttr8738 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab
天远Date Lab8 小时前
Python实战:对接天远数据手机号码归属地API,实现精准用户分群与本地化运营
大数据·开发语言·python
listhi5208 小时前
基于Gabor纹理特征与K-means聚类的图像分割(Matlab实现)
开发语言·matlab
qq_433776429 小时前
【无标题】
开发语言·php
会周易的程序员9 小时前
多模态AI 基于工业级编译技术的PLC数据结构解析与映射工具
数据结构·c++·人工智能·单例模式·信息可视化·架构