go sync.oncevalue一个单例的更简实现
我来为你详细解析 sync.OnceValue —— Go 1.21 引入的并发安全初始化工具。核心概念sync.OnceValue 是 Go 1.21 新增的泛型函数用于惰性且线程安全地初始化一个值gofunc OnceValue[T any](f func() T) func() T它返回一个闭包确保 f 只执行一次后续调用直接返回缓存结果。---基础用法gopackage mainimport (fmtsynctime)func main() {// 定义一个昂贵的初始化操作initConfig : sync.OnceValue(func() map[string]string {fmt.Println(⚙️ 正在加载配置... (只执行一次))time.Sleep(100 * time.Millisecond) // 模拟耗时操作return map[string]string{db_host: localhost,db_port: 5432,api_key: secret-123,}})// 并发多次获取配置var wg sync.WaitGroupfor i : 0; i 5; i {wg.Add(1)go func(id int) {defer wg.Done()config : initConfig() // 并发安全调用fmt.Printf(Goroutine %d: %v\n, id, config[db_host])}(i)}wg.Wait()// 再次调用直接返回缓存值cfg : initConfig()fmt.Printf(Final call: %v\n, cfg)}输出⚙️ 正在加载配置... (只执行一次)Goroutine 2: localhostGoroutine 0: localhostGoroutine 4: localhostGoroutine 1: localhostGoroutine 3: localhostFinal call: map[api_key:secret-123 db_host:localhost db_port:5432]---与 sync.Once 的对比特性 sync.Once sync.OnceValue代码量 需要额外变量存储结果 自动缓存返回值类型安全 需手动类型断言 泛型支持类型安全复用性 封装较繁琐 返回闭包可传递错误处理 需手动处理 需配合 OnceValue error 模式传统 sync.Once 写法govar (once sync.Onceconfig map[string]string)func GetConfig() map[string]string {once.Do(func() {config loadConfig() // 需外部变量存储})return config}OnceValue 写法更简洁govar getConfig sync.OnceValue(func() map[string]string {return loadConfig()})// 使用config : getConfig()---高级场景1. 带错误处理的初始化OnceValuesgo// Go 1.21 也提供了 OnceValues 用于多返回值var initDB sync.OnceValues(func() (*sql.DB, error) {db, err : sql.Open(postgres, dsn)if err ! nil {return nil, err}return db, db.Ping()})// 使用db, err : initDB()2. 单例模式实现gotype Service struct {client *http.Client}var getService sync.OnceValue(func() *Service {return Service{client: http.Client{Timeout: 30 * time.Second},}})func Instance() *Service {return getService()}3. 延迟计算 缓存go// 计算斐波那契数列带缓存var fib sync.OnceValue(func() []int {fmt.Println(计算斐波那契数列...)seq : make([]int, 50)seq[0], seq[1] 0, 1for i : 2; i 50; i {seq[i] seq[i-1] seq[i-2]}return seq})// 多次调用只计算一次fmt.Println(fib()[10]) // 55fmt.Println(fib()[20]) // 6765---关键特性总结1. 线程安全内部使用 sync.Once保证并发安全2. 惰性求值首次调用时才执行初始化3. 结果缓存执行结果永久缓存后续调用零开销4. 泛型支持编译期类型检查无需类型断言5. 不可重置一旦初始化完成无法重新执行如需重置需重新创建---适用场景- ✅ 全局配置加载- ✅ 数据库连接池初始化- ✅ 单例服务对象- ✅ 昂贵的计算结果缓存- ✅ 资源预加载图片、模板等sync.OnceValue 让 Go 的惰性初始化代码更加简洁、类型安全是替代传统 sync.Once 全局变量的现代最佳实践。

相关新闻

weixin205微信小程序线上教育商城ssm(源码)_kaic

weixin205微信小程序线上教育商城ssm(源码)_kaic

5 系统实现 系统实现部分就是将系统分析,系统设计部分的内容通过编码进行功能实现,以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析,系统设计最主要还是进行功能,系统操作逻辑的设计,也包…

2026/7/6 0:02:45 阅读更多 →
从原理到落地:一文读懂检索增强生成RAG核心逻辑详解

从原理到落地:一文读懂检索增强生成RAG核心逻辑详解

RAG (Retrieval-Augmented Generation,检索增强生成)是目前大模型(LLM)落地应用中最核心、最热门的技术方案之一。简单来说,RAG 就是给大模型配上了一个“外部知识库”或“搜索引擎”。 接下来我会从我们“为什么需要它”、“它是…

2026/7/3 14:40:45 阅读更多 →
86_Spring AI 干货笔记之 Chroma 向量存储

86_Spring AI 干货笔记之 Chroma 向量存储

一、Chroma 本节将引导您设置 Chroma VectorStore 来存储文档嵌入并执行相似性搜索。 Chroma 是一个开源的嵌入数据库。它为您提供了存储文档嵌入、内容和元数据的工具,以及搜索这些嵌入(包括元数据过滤)的功能。 二、先决条件 访问 ChromaDB: 与 Chroma Cloud 兼容,或…

2026/7/3 14:40:46 阅读更多 →

最新新闻

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码

免费二维码修复工具终极指南:三步拯救损坏二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经面对一个损坏的二维码束手无策?模糊、破损、打印质量差的二…

2026/7/5 23:59:17 阅读更多 →
AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字?

AsrTools:如何用一款开源工具在5分钟内完成专业级语音转文字? 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your au…

2026/7/5 23:57:17 阅读更多 →
YOLOv8融合坐标注意力机制优化目标检测性能

YOLOv8融合坐标注意力机制优化目标检测性能

1. YOLOv8与坐标注意力机制融合背景目标检测作为计算机视觉的基础任务,其发展始终围绕精度与速度的平衡展开。YOLO系列算法因其"一次检测"的设计理念,在实时性上具有先天优势。YOLOv8作为该系列的最新代表作,通过更深的网络结构、更…

2026/7/5 23:55:16 阅读更多 →
基于深度学习的工程图纸形位公差自动识别技术解析

基于深度学习的工程图纸形位公差自动识别技术解析

1. 项目背景与核心价值在机械制造和工程图纸设计领域,形位公差的标注与识别一直是影响生产效率的关键环节。传统的人工识别方式不仅耗时费力,而且容易因视觉疲劳导致误判。我们团队开发的"简会图纸识别系统"正是为了解决这一行业痛点而生。这套…

2026/7/5 23:53:15 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻