当前位置: 首页 > news >正文

宁波住房和建设局网站青岛市城乡建设局网站

宁波住房和建设局网站,青岛市城乡建设局网站,大连科技公司建设网站,西宁做网站ci君博却上GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
17、GO学习之 goroutine的调度原理
18、GO学习之 通道(nil Channel妙用)
19、GO学习之 同步操作sync包
20、GO学习之 互斥锁、读写锁该如何取舍
21、GO学习之 条件变量 sync.Cond
22、GO学习之 单例模式 sync.Once

文章目录

  • GO系列
  • 前言
  • sync.Once 如何使用

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
sync.Once又是什么呢?某个 goroutine 只需要且只能执行一次,到目前为止我们知道程序运行期间只被执行一次的就是每个包的 init 函数,sync包也提供了这样一种更灵活的机制,可以保证 任意一个函数 在程序运行期间只被执行一次,就是 sync.Once了。

sync.Once 如何使用

在 JAVA 开发中,Spring 框架使用了 单例模式 来创建实体 Bean,我们在开发中也是多用单例模式来避免实例的重复创建。
在 Go 标准库中,sync.Once 的 “仅仅执行一次” 的特性被多用于初始化操作或者是资源清理的过程中,以避免重复执行导致性能不是最佳。
sync.Once 的语义十分适合实现单例模式(singleton)模式,并且实现起来也和简单,如下获取实例的例子:

package mainimport ("log""sync""time"
)// 定义一个结构体对象
type Entity struct{}var once sync.Once// 声明一个接口实例,用于存放实例
var instance *Entityfunc GetFun(id int) *Entity {// 延迟获取异常信息defer func() {e := recover()if e != nil {log.Printf("goroutine %d catch a panic: %s \n", id, e)}}()log.Printf("goroutine %d start run... \n", id)// once.Do 真正的执行创建实体操作once.Do(func() {instance = &Entity{}time.Sleep(3 * time.Second)log.Printf("goroutine %d create instance : %p\n", id, instance)panic("success to create a instance")})return instance
}func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func(i int) {inst := GetFun(i)log.Printf("goroutine %d get a instance: %p", i, inst)wg.Done()}(i + 1)}time.Sleep(5 * time.Second)inst := GetFun(0)log.Printf("goroutine %d get a instance: %p", 0, inst)wg.Wait()log.Printf("all goroutine done \n")
}

运行结果:

PS D:\workspaceGo\src\sync> go run .\sync_once_main.go
2023/12/02 16:17:04 goroutine 5 start run... 
2023/12/02 16:17:04 goroutine 2 start run...
2023/12/02 16:17:04 goroutine 1 start run...
2023/12/02 16:17:04 goroutine 3 start run...
2023/12/02 16:17:04 goroutine 4 start run...
2023/12/02 16:17:07 goroutine 5 create instance : 0xa477c0
2023/12/02 16:17:07 goroutine 5 catch a panic: success to create a instance
2023/12/02 16:17:07 goroutine 5 get a instance: 0x0
2023/12/02 16:17:07 goroutine 3 get a instance: 0xa477c0
2023/12/02 16:17:07 goroutine 2 get a instance: 0xa477c0
2023/12/02 16:17:07 goroutine 4 get a instance: 0xa477c0
2023/12/02 16:17:07 goroutine 1 get a instance: 0xa477c0
2023/12/02 16:17:09 goroutine 0 start run... 
2023/12/02 16:17:09 goroutine 0 get a instance: 0xa477c0
2023/12/02 16:17:09 all goroutine done

从运行结果中我们可以观察到,sync.Do 会等待 func() 执行完毕才返回,在这期间其他的执行 once.Do 函数的 goroutine(如上述例子的 goroutine 1 ~ 4) 将会阻塞等待。
等 goroutine 5 的 sync.Do 执行完后,其他的 goroutine 在调用 sync.Do 时将不再执行里面的 func() 并立即返回(如 goroutine 0)。
我们还可以观察到,即便在函数 func() 中出现 panic, sync.Once 依旧认为 once.Do 执行完毕,其他 goroutine 调用 once.Do 将不再执行 func() 。


现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!

http://www.yayakq.cn/news/472039/

相关文章:

  • 通州网站建设多少钱室内装修设计自学教材
  • 网站后台 更新缓存惠州禅城网站建设
  • 网站概念设计旅游景点网站建设设计说明
  • 网站开发技术规范网站icp备案
  • 四川网站营销seo什么价格宠物网站开发与实现结论
  • 做网站时如何写接口文档wordpress怎么首页添加板块
  • 阿里云建站流程南京建设局网站
  • 站群 网站如何做商务网站建设难不难
  • 软件网站开发平台wordpress插件团购
  • 赣州企业网站建设公司建设项目环境影响备案网站
  • 怎么做网站的浏览量济南网站建设认可搜点网络能
  • 成都工业学院文献检索在哪个网站做淘宝数据分析
  • 鲜花网站的数据库建设上海网站备案咨询
  • 百度图在图不留网站方塑料模板厂 塑料模板生产厂家
  • 凡科 360免费建站联想网站建设与分析
  • 襄阳做淘宝网站推广大型网站开发 优帮云
  • vue.js网站如果做自适应wordpress赞助插件
  • xuzhou网站制作网站的简单布局
  • 手机网站与微信结合网页制作软件都有哪些
  • 南通网站建设推广优化市场营销推广方案怎么做
  • 网站建设计划书怎么写深圳商场设计公司排名
  • 网站超链接怎么做 word文档建一个公司需要多少钱?
  • 网站建设公司果动何鹏seo
  • 网站标题怎么隔开网站别人做的收到方正侵权
  • 河北燕郊网站制作房地产市场低迷
  • 怎么样做外贸网站王烨萍
  • 自建设网站公司做网站那个网站好
  • 做政协网站的目的是什么项目合作网站
  • 旅游类网站设计模板下载不会代码建设网站
  • 建设内部网站目的iis7搭建网站