golang sync.Once介绍

2024-06-12 13:18
文章标签 golang 介绍 sync

本文主要是介绍golang sync.Once介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

================================
go grpc-go 相关技术专栏 总入口

go语言基础知识总结、整理、收藏

================================

1、sync.Once.Do(f func())作用?

能保证sync.Once.Do只执行一次,

无论是否更换sync.Once.Do(f func())里的函数

这个sync.Once块只会执行一次。

2、sync.Once.Do(f func())使用场景?

如:
服务启动的时候:

  • 链接mysql数据库
  • 对数据库表的创建操作

服务异常退出时

在这里插入图片描述

3、sync.Once.Do(f func()) 根据 init函数的区别

作用与 init 函数类似。但也有所不同。

init 函数是在 文件包首次被加载的时候执行,且只执行一次

sync.Onc 是在 代码运行中需要的时候执行,且只执行一次

4、单元测试用例

package synconceimport ("testing""fmt""time""sync"
)
var once sync.Once
func TestSyncOnce(t *testing.T) {for i:=0;i<2; i++ {once.Do(onces)fmt.Println("count:",  i)}for i := 0; i < 2; i++ {go func() {once.Do(onced)fmt.Println("213")}()}time.Sleep(4000)
}func onces() {fmt.Println("---onces---")
}
func onced() {fmt.Println("---onced---")
}

测试结果:

=== RUN   TestSyncOnce
---onces---
count: 0
count: 1
213
--- PASS: TestSyncOnce (0.00s)
PASS
213Process finished with exit code 0

从测试结果,可以看出来

sync.Once.Do只执行了一次。

先将onces函数扔给sync.Once.Do执行,
再重新将onced函数扔给sync.Once.Do执行,

当sync.Once.Do(f fun)里f更新后,也不再重新执行了。

即,在整个期间,sync.Once.Do只执行一次。

这篇关于golang sync.Once介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054323

相关文章

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow