返回顶部
首页 > 资讯 > 精选 >带有 Go 泛型的单例模式
  • 680
分享到

带有 Go 泛型的单例模式

2024-02-06 05:02:40 680人浏览 安东尼
摘要

问题内容 我正在尝试找出在 golang 中为泛型变量实现单例的最不糟糕的方法。使用普通的 sync.once 模式与全局变量是行不通的,因为通用类型信息在那里不可用(如下)。 这个示

问题内容

我正在尝试找出在 golang 中为泛型变量实现单例的最不糟糕的方法。使用普通的 sync.once 模式与全局变量是行不通的,因为通用类型信息在那里不可用(如下)。

这个示例是人为设计的,但实际上,维护单例的代码可以与定义 t 的客户端代码分开(例如在库中)。

假设此库代码,其中 t 的具体值未知:

type cache[t any] struct{}

var (
    cacheonce sync.once
    cache     cache[any] // global singleton
)

func getorcreatecache[t any]() cache[t] {
    cacheonce.do(func() {
        typedcache := buildcache()
        cache = typedcache.(cache[any]) // invalid type assertion
    })
    return cache.(cache[t]) // invalid type assertion
}

并假设这个单独的客户端代码,其中 t 被定义为 string

strinGCache := getOrCreateCache[string]()

实现这一目标的最佳方法是什么?


正确答案


我最终使用 atomic.pointer api 解决了这个问题,并将其整合到一个简单的库中,供其他感兴趣的人使用:单线。使用单线态重新处理原始帖子如下所示:

示例库代码:

type cache[t any] struct{}

var singleton = &singlet.singleton{}

func getorcreatecache[t any]() (cache[t], err) {
    return singlet.getordo(singleton, func() cache[t] {
        return cache[t]{}
    })
}

客户端代码:

stringcache := getorcreatecache[string]()

以及支持此功能的 singlet 库代码:

var ErrTypeMismatch = errors.New("the requested type does not match the singleton type")

type Singleton struct {
    p   atomic.Pointer[any]
    mtx sync.Mutex
}

func GetOrDo[T any](singleton *Singleton, fn func() T) (result T, err error) {
    maybeResult := singleton.p.Load()
    if maybeResult == nil {
        // Lock to guard against applying fn twice
        singleton.mtx.Lock()
        defer singleton.mtx.Unlock()
        maybeResult = singleton.p.Load()

        // Double check
        if maybeResult == nil {
            result = fn()
            var resultAny any = result
            singleton.p.Store(&resultAny)
            return result, nil
        }
    }

    var ok bool
    result, ok = (*maybeResult).(T)
    if !ok {
        return *new(T), ErrTypeMismatch
    }
    return result, nil
}

我希望对遇到这种情况的其他人有所帮助。

以上就是带有 Go 泛型的单例模式的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 带有 Go 泛型的单例模式

本文链接: https://lsjlt.com/news/561188.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 带有 Go 泛型的单例模式
    问题内容 我正在尝试找出在 golang 中为泛型变量实现单例的最不糟糕的方法。使用普通的 sync.once 模式与全局变量是行不通的,因为通用类型信息在那里不可用(如下)。 这个示...
    99+
    2024-02-06
  • Python 设计模式创建型单例模式
    目录一、单例模式二、应用场景三、编码示例1.单线程中的单例模式方式一、重载类构造器方式二、实现单例装饰器2.多线程中的单例模式方式三、重载具有线程锁的类构造器一、单例模式 单例模式,...
    99+
    2024-04-02
  • Go语言单例模式详解
    目录什么是单例模式Go中实现单例模式的方式方法一: 懒汉式方法二:饿汉式方法三:双重检查锁定示例总结单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。...
    99+
    2023-03-23
    Go语言单例模式
  • Java创建型设计模式之单例模式
    目录介绍优点实现饿汉式懒汉式静态内部类枚举介绍 单例模式是一种创建型设计模式,其主要特点包括: 只有一个实例:单例模式确保系统中只有一个实例对象存在,所有对该对象的访问都是对同一个对...
    99+
    2023-05-18
    Java单例模式 Java创建型设计模式
  • Go语言单例模式示例详解
    目录简单单例模式加锁的单例模式双check 的单例模式sync.Once 的单例模式简单单例模式 单例模式是创建类型的模式,它是为了保证执行期间内只有一个实例。使用 Golang 指...
    99+
    2024-04-02
  • Go:如何创建带有单元测试值的 schema.ResourceData 类型的实例?
    学习Golang要努力,但是不要急!今天的这篇文章《Go:如何创建带有单元测试值的 schema.ResourceData 类型的实例?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注...
    99+
    2024-04-04
  • 详解Go语言设计模式之单例模式
    目录单例模式的概念单例模式结构单例模式的使用场景单例模式例子:特殊的计数器第一个单元测试单例模式实现单例模式优缺点单例模式的概念 单例模式很容易记住。就像名称一样,它只能提供对象的单...
    99+
    2024-04-02
  • 一文带你搞懂PHP单例模式
    目录简介场景优点缺点示例代码简介 单例模式是创建型对象的一种,用于如何优雅的创建对象。 让一个类最多产生一个对象。 场景 只需要一个对象就能解决并且要使用多次的场景,比如框架的数据库...
    99+
    2022-12-20
    PHP单例模式 PHP设计模式
  • 一文带你搞懂Java单例模式
    目录一、单例模式的基本写法二、单例模式的作用三、单例模式的变种1. 饿汉式2. 懒汉式(线程不安全)3. 懒汉式(线程安全)4. 双检锁/双重校验锁(DCL,double-check...
    99+
    2022-11-13
    Java单例模式 Java设计模式 Java 设计模式 单例模式
  • java编程创建型设计模式单例模式的七种示例
    目录1.什么是单例模式?2.七种写法2.1 饿汉式(静态常量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全,同步方法)2.5 双重校验锁2.6 静...
    99+
    2024-04-02
  • java单例模式有哪些
    java中的单例模式有:1.懒汉式单例;2.饿汉式单例;3.登记式单例;java中的单例模式有以下几种懒汉式单例java中懒汉式单例是指单例类在第一次调用时进行实例化,不存在多线程同步问题,可以避免synchronized所造成的性能问题。...
    99+
    2024-04-02
  • 单例模式的细节有哪些
    这篇文章主要介绍“单例模式的细节有哪些”,在日常操作中,相信很多人在单例模式的细节有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”单例模式的细节有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!从去...
    99+
    2023-06-15
  • Go单例模式与Once源码实现
    目录单例实现sync.Once源码分析1. lock并不会同步值2. Do执行一次3. Once执行Do后不准copy4. Do并发时阻塞5. Do递归死锁单例实现 type sin...
    99+
    2022-12-08
    go单例模式 go Once源码
  • Go语言单例模式怎么实现
    这篇文章主要介绍“Go语言单例模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言单例模式怎么实现”文章能帮助大家解决问题。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常...
    99+
    2023-07-05
  • python的单例模式
    python单例模式 所谓单例,就是保证一个类仅有一个实例。所有引用(实例、对象)拥有相同的状态(属性)和行为(方法); 同一个类的所有实例天然拥有相同的行为(方法); 只需要保证同一个类的所有实例具有相同的状态(属性)即可; 所有实例共享...
    99+
    2023-01-31
    模式 python
  • 这是泛型的有效用例吗?
    问题内容 现在在我的代码中,我有一堆看起来像这样的重复工作。 type fp = func(arg1 string, arg2 int, arg3 []string) bool fun...
    99+
    2024-02-06
  • 深入解析Go语言中的单例模式
    单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。在 Go 语言中,实现单例模式有多种方式,本篇文章将带你深入掌握 Go 语言中的单例模式实现。什么是单例模式单例模式指仅允许创建一个对象的设计模式。它通常应用...
    99+
    2023-05-14
    Go 设计模式
  • Go语言中的单例模式怎么实现
    本篇内容介绍了“Go语言中的单例模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是单例模式单例模式指仅允许创建一个对象的设计模...
    99+
    2023-07-05
  • Java设计模式之单例和原型
    今天这篇文章我们来学习创建型设计模式的另外两个孪生兄弟,单例和原型,其中原型设计模式中我们深入到JVM的内存模型,最后顺便谈谈Java中的值传递和引用传递。 上篇文章老王买产品&nb...
    99+
    2024-04-02
  • 如何分析.NET独有精巧泛型设计模式
    如何分析.NET独有精巧泛型设计模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。虽然泛型出现已有多年,连Java都早已借鉴引入了泛型(虽然是语法糖),可是用泛...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作