Go语言中单例模式分为饿汉和懒汉模式:饿汉模式在包加载时创建实例,线程安全,适用于轻量且必用场景;懒汉模式首次调用时初始化,节省资源,需用sync.Once保证并发安全,适合高开销或可能不用的对象。

在Go语言中,单例模式是一种常见的设计模式,用于确保一个类在整个程序运行期间只有一个实例。根据实例创建的时机不同,可分为“饿汉模式”和“懒汉模式”。下面分别介绍这两种方式的实现。
饿汉模式(Eager Initialization)
饿汉模式在包加载时就创建好实例,线程安全,适用于实例初始化成本不高且一定会用到的场景。
示例代码:
package singletonimport "fmt"// 定义单例结构体type Singleton struct { Data string}// 包初始化时直接创建实例var instance = &Singleton{Data: "饿汉模式实例"}// GetInstance 返回唯一实例func GetInstance() *Singleton { return instance}// 使用示例func ExampleEager() { s1 := GetInstance() s2 := GetInstance() fmt.Println(s1 == s2) // 输出 true,证明是同一个实例}
懒汉模式(Lazy Initialization)
懒汉模式在第一次调用获取实例方法时才创建,可以延迟资源消耗,但需注意并发安全问题。使用 sync.Once 可保证只初始化一次。
示例代码:
package singletonimport ( "sync")// 定义单例结构体type Singleton struct { Data string}var ( instanceLazy *Singleton once = &sync.Once{})// GetInstanceLazy 第一次调用时创建实例func GetInstanceLazy() *Singleton { once.Do(func() { instanceLazy = &Singleton{Data: "懒汉模式实例"} }) return instanceLazy}// 使用示例func ExampleLazy() { s1 := GetInstanceLazy() s2 := GetInstanceLazy() fmt.Println(s1 == s2) // 输出 true}
两种模式对比与选择建议
实际开发中可根据需求选择合适的实现方式:
立即学习“go语言免费学习笔记(深入)”;
饿汉模式:启动即创建,简单安全,适合轻量且必用的对象 懒汉模式:按需创建,节省资源,适合初始化开销大或可能不用的情况 并发环境下推荐使用 sync.Once 实现懒加载,避免竞态条件基本上就这些,Go语言通过包级变量和 sync 包能简洁高效地实现单例模式。
以上就是Golang单例模式懒汉与饿汉实现示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1411225.html
微信扫一扫
支付宝扫一扫