首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

go如何优雅的写单例?

在Go语言中,优雅地编写单例模式可以通过使用包级别的变量和匿名函数实现。以下是一个简单的示例:

代码语言:go
复制
package main

import "fmt"

var instance *singleton

func getInstance() *singleton {
    if instance == nil {
        instance = &singleton{}
    }
    return instance
}

type singleton struct{}

func (s *singleton) doSomething() {
    fmt.Println("Doing something...")
}

func main() {
    s1 := getInstance()
    s1.doSomething()

    s2 := getInstance()
    s2.doSomething()

    fmt.Printf("s1 and s2 are the same instance: %v\n", s1 == s2)
}

在这个例子中,我们使用了一个包级别的变量instance来存储单例实例。getInstance函数用于获取单例实例。当第一次调用getInstance时,如果instancenil,则会创建一个新的singleton实例。后续的调用将返回已创建的实例。

main函数中,我们通过调用getInstance获取两个单例实例s1s2,并调用它们的doSomething方法。最后,我们比较s1s2是否相同,以验证它们是否是相同的单例实例。

这种方法在Go语言中实现单例模式的同时,保持了代码的简洁和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

漫画:如何写出更优雅模式?

上一次为大家介绍了模式基本概念和几种实现方式,没看过小伙伴们可以点击下面链接: 漫画:什么是设计模式? 如果懒得去看也不要紧,让我们来简单回顾一下。...使用volatile修饰符,防止指令重排引发初始化问题。 这个实现方式虽然保证了线程安全,但仍然存在一些缺陷,如何写出更优雅模式呢?让我们进入今天主题。...2.INSTANCE对象初始化时机并不是在类Singleton被加载时候,而是在调用getInstance方法,使得静态内部类LazyHolder被加载时候。...因此这种实现方式是利用classloader加载机制来实现懒加载,并保证构建线程安全。 如何利用反射打破模式约束?其实很简单,我们来看下代码。...,不但可以防止利用反射强行构建对象,而且可以在枚举类对象被反序列化时候,保证反序列返回结果是同一对象。

37220

如何在Spring中优雅使用模式?

返璞归真 模式设计模式之初,是脱发万恶之源,手动滑稽。...但是可以通过Constructor反射方式获取私有化构造器然后通过构造方法去创建对象。 模式 模式提供了创建对象最佳方式:一个类有且仅有一个实例&&该实例可共享。...Spring下使用模式 最成功并不是双重检验锁,而是枚举,枚举本身就是一种,并且无法使用反射攻击,再一个最优雅是Spring本身实现: 常用Spring中 @Repository、...@Component、@Configuration @Service注解作用下类默认都是模式,所以,我目前认为在Spring下使用最优方式是将类@Component注册为组件。...并不是所有的注解默认都是模式,@RestController就是多例 注解原因----Spring实现原因 把类注册为组件Bean后,从运行开始到结束,类只加载到内存一次,类进行初始化,

6.3K20

Go模式

前言 近期手上有一些需要定时任务需求(Go定时任务可以看这一篇:Go-并发编程与定时器),而模式可以很好保证定时任务不被重复创建,Go在官方库中也提供了优雅模式实现方式,即sync包中...需要了解几个词 模式:模式,也叫单子模式,是一种常用软件设计模式,属于创建型模式一种。...在应用这个模式时,对象类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体行为。...比如在某个服务器程序中,该服务器配置信息存放在一个文件中,这些配置数据由一个对象统一读取,然后服务进程中其他对象再通过这个对象获取这些配置信息。...总结 Go模式实现其实很优雅简单,但我们可以深究源码,深入了解到Go并发编程一些相关知识

20041

Go 模式

这样是有问题,因为如果对这个实例已经在代码中被应用,可能会有潜在多个这个类型实例,并用有各自状态,产生潜在不同代码行为。...,并且在创建实例前获取锁。...问题在于当我们不需要时候例如,实例已经被创建时候,只需要返回缓存实例,但是呢也会执行锁操作。...在高并发代码基础上,这会产生瓶颈,因为在同一时间只有一个go routine可以得到实例。      所以这不是最好方法,我们找找其他解决方案。  ...语言和标准库源码看一下go routines 同步实现方式来做更好  Go惯用方法    我们想要使用Go惯用手法来实现这个模式。

1K100

Go如何优雅地查文档

某天代码时发现自己对 IDE 依赖非常深,如果没了 Goland 就不会写代码了,心里为之一惊。...进而又想到,当补全功能缺失或者暂时失灵情况下,该如何快速地查出某个函数具体用法呢? 假设我们想要对字符串做 split,却忘了具体用法,下面是几种常见查文档方法。...go doc cmd 优点是直接 iTerm2 里就可以查看,缺点是需要准确地记住包名+函数名。 有些大佬用 vim 代码,在 shell 环境里直接能查文档,还是很有用。...最近看到一篇文章[2],就讲了如何利用 Go 标准库做出一个好用查文档工具。 原理是利用 Go 提供包解析工具,把所有的导出类型列出来。...然后在我们搜索时候用模糊匹配方式找到符合类型,再用这个精确类型调用 go doc。

67020

最简单模式,Go版本实现你对了吗?

模式虽然简单,不过还是有一些说道儿,一是应用比较广泛,再来如果不注意容易在多线程环境下造成BUG,今天就给大家简单说下单模式应用,以及用Go语言怎么正确地实现模式。...模式 上面对话里说没错,模式是用来控制类型实例数量,当需要确保一个类型只有一个实例时,就需要使用模式。...饿汉模式 这个模式用 Go 语言实现时,借助 Go init函数来实现特别方便 如果你想了解 Go init 函数方方面面,可以看以前老文章Go语言init函数你必须记住六个特征 下面用模式返回数据库连接实例...…我发现我Go 并发编程系列里没单独Once这个原语,可能是觉得太简单了吧,后期抽空补上吧… 不过只是原理分析没写,怎么应用在Go语言sync包应用详解里也能找到。...总结 这篇文章其实是把模式应用,和Go模式版本怎么实现给大家说了一下,现在教程大部分都是用 Java 讲设计模式,虽然我们可以直接翻译,不过有的时候 Go 有些更native 实现方式,

86530

聊聊 Go模式

模式在软件开发中是一种常见设计模式,用于确保一个类在任何情况下都仅有一个实例,并提供一个访问它全局访问点。在 Go 语言中,实现模式通常有两种方式:饿汉式 和 懒汉式。...今天,我们就来详细了解这两种实现方式,并通过简单易懂代码示例解释相关概念。饿汉式模式饿汉式模式核心思想是:类加载时就创建实例。...下面是一个饿汉式模式实现示例:// 饿汉式模式package maintype singleton struct { count int}// 饿汉式,程序启动即初始化var Instance...小结模式在需要全局访问点且只希望创建一个实例场景下非常有用。饿汉式模式简单但可能造成资源浪费,而懒汉式模式则更加灵活,但需要处理线程安全问题。...Go 语言并发特性使得实现懒汉式模式时,双重检查锁定模式成为了一个优雅解决方案。通过以上介绍和代码示例,相信你已经对饿汉式和懒汉式模式有了基本了解和认识。

9810

真的对吗

模式是设计模式中最容易理解、最容易上手设计模式,同时也是最容易出错设计模式。它实现写法有多种,但是并不都是正确写法。...1饿汉模式 饿汉,即迫切、立马,所以饿汉模式又称作立即加载,下面代码实现是它最普遍写法。...public static SingletonObject getInstance() { return singletonObject; } } 这种写法实现对象会在类加载时创建...这里volatile是为了禁止指令重排序,能保证happens-before relationship,所有的都将先行发生于读。...8枚举实现 使用枚举实现,这种方式也是线程安全,但是使用比较少,读者可自行实现。 总结 以上这几种写法,可根据具体需求来选择,需要注意是线程安全问题和效率问题。

71540

2018-06-13 如何优雅高效创建——枚举Enum

作为23种设计模式中最为常用设计模式,模式并没有想象那么简单。因为在设计时候要考虑很多问题,比如线程安全问题、序列化对破坏等。...如果你对不是很了解,或者对于线程安全问题以及序列化会破坏等问题不是很清楚,可以先阅读以上文章。上面六篇文章看完之后,相信你一定会对模式有更多,更深入理解。...image 哪种方式最好 image 在StakcOverflow中,有一个关于What is an efficient way to implement a singleton pattern...image.gif 枚举写法简单 image.gif 如果你看过《模式七种写法》中实现所有方式代码,那就会发现,各种方式实现代码都比较复杂。...image.gif 枚举可避免反序列化破坏 image.gif 前面我们提到过,使用“双重校验锁”实现其实是存在一定问题,就是这种有可能被序列化锁破坏,关于这种破坏及解决办法,参看与序列化那些事儿

99750

模式(上)---如何优雅地保证线程安全问题

帅地:学过模式吧?模式有多种写法,一种出来看看。 小秋:好啊,听说模式是面试中问最多一种模式,对于模式几种写法,我可以相当熟练哦(有点得意)。...instance = new Singleton(); } return instance; } } 注:不清楚synchronized关键字可以看我之前文章...= null了,所以p2无法再创建新实例对象。 小秋听到帅地夸奖自己,满脸开心…. 指令重排捣蛋 帅地:不过,你这样,还不算是绝对线程安全,还是有可能会出现线程安全问题。你在仔细想想。...帅地:好吧,你已经挺不错了,今天就再让你涨涨知识。 其实这个线程安全问题,主要是因为对象创建过程并非是原子性。在创建过程中,由于指令重排影响,才导致出现问题。...Singleton(); } } } return instance; } } 注:不清楚volatile关键字可以看我之前文章

83720

如何优雅 Controller 层代码?

请求方式(一般就是 get、set,当然还有 put、delete) 请求数据(request,有 head 跟 body) 响应数据(response) 本篇将解决以下 3 个问题: 当接收到请求时,如何优雅校验参数...返回响应数据该如何统一进行处理 接收到请求,处理业务逻辑时抛出了异常又该如何处理 Controller 层参数接收(太基础了,可以跳过) 常见请求就分为 get 跟 post 两种: @RestController...参数:至于参数部分,只需要写上 ProductInfoQueryVo,前端过来 json 请求便会通过映射赋值到对应对象中,例如请求这么,productId 就会自动被映射到 vo 对应属性当中...还是直接死 1000?...,比如库存不能小于 0 子类,这种异常并非程序异常,而是业务操作引发异常,我们也需要进行规范编排业务异常状态码,并且一个专门处理异常类,最后通过刚刚学习过异常拦截统一进行处理,以及打日志。

76320

如何优雅编写测试用

上次我们说到测试用设计(可参考往期文章「测试用设计底层逻辑」)。 当你学会了如何设计测试用之后,接下来便是开始用编写。...在设计阶段,更准确说应该是识别测试点过程,而编写阶段则是将测试点细化成一条条测试用过程,有了比较全场景后,如何让别人更舒服、更方便、更清晰地去使用你测试用如何优雅地展示你测试用...,如何让领导对你测试用满意呢?...正好最近有小伙伴问到关于用模板问题,借此机会来聊一聊“如何优雅编写测试用”这个话题。 图片 PS:需要用模板加V获取。...用步骤一般不多于7步,不少于2步。 操作步骤也是不可或缺一部分,因为它关系到如何执行。 测试数据 在执行测试时,需要输入一些外部数据来完成测试。

50931

不是——巧用ClassLoader

本文通过如何将一个类实例化两次案例,用代码实践来引入 Java 类加载器相关概念与工作机制。理解并熟练掌握相关知识之后可以扩宽解决问题思路,另辟蹊径,达到目的。...背景 模式是最常用设计模式之一。其目的是保证一个类在进程中仅有一个实例,并提供一个它全局访问方式。那什么场景下一个进程里需要两个对象呢?很明显这破坏了模式设计初衷。...实例化两个类 我们假设下述类代码是 RPC 调用 Client: public class RPCClient { private static BaseClient baseClient...,依赖类加载器也会使用当前类加载器,当我们利用自定义类加载器来将一个类实例化两次时候,能保证两个对象是完全隔离。...总结 本文通过如何将一个类实例化两次案例,用代码实践来引入 Java 类加载器相关概念与工作机制。理解并熟练掌握相关知识之后可以扩宽解决问题思路,另辟蹊径,达到目的。

31720

go解锁设计模式之模式

前言 哈喽,大家好,我是asong,这是我第16篇原创文章,感谢各位关注。今天给大家分享设计模式之模式,并使用go语言实现。...熟悉java同学对模式一定不陌生,模式,是一种很常见软件设计模式,在他核心结构中只包含一个被称为特殊类。...下面我们就一起来看一看怎么使用go实现模式,这里有一个小坑,一定要注意一下,结尾告诉你哦~~~ 什么是模式 模式确保某一个类只有一个实例。为什么要确保一个类只有一个实例?...小坑 还记得我开头说一句话,go语言中使用模式有一个小坑,如果不注意,就会导致我们模式没有用,可以观察一下我代码,除了GetInstance方法外其他都使用小写字母开头,知道这是为什么吗...这里type singleton struct {我们如果使用大写,那么我们这些方法就没有意义了,其他包可以通过s := &singleton{}创建多个实例,模式就显得很没有意义了,所以这里一定要注意一下哦

56230
领券