Go语言的sync.Once()函数

sync.Once 是 Go 语言标准库 sync 包提供的一个类型,它用于确保一个函数只会被执行一次,即使在多个 goroutine 中同时调用。

sync.Once 包含一个 Do 方法,其签名如下:

go 复制代码
func (o *Once) Do(f func()) 

Do 方法接受一个函数作为参数,并且保证该函数只会被调用一次,即使在多个 goroutine 中同时调用 Do 方法。

通常,sync.Once 的用法是在需要确保某个操作只执行一次的情况下使用,比如在初始化全局变量时。

以下是一个示例:

go 复制代码
package main

import (
	"fmt"
	"sync"
)

var (
	once sync.Once
	num  int
)

func setup() {
	num = 42
	fmt.Println("Setup complete")
}

func main() {
	for i := 0; i < 3; i++ {
		once.Do(setup)
		fmt.Println(num)
	}
}

在上述示例中,setup 函数将被 sync.Once 确保只会执行一次,即使在多次调用 once.Do(setup) 也是如此。这保证了 num 变量只会被初始化一次。

相关推荐
Bony-8 小时前
Go语言垃圾回收机制详解与图解
开发语言·后端·golang
吴老弟i20 小时前
Go 多版本管理实战指南
golang·go
Grassto1 天前
HTTP请求超时?大数据量下的网关超时问题处理方案,流式处理,附go语言实现
后端·http·golang·go
Paul_09201 天前
golang编程题2
开发语言·后端·golang
代码N年归来仍是新手村成员1 天前
【Go】从defer关键字到锁
开发语言·后端·golang
源代码•宸2 天前
Leetcode—746. 使用最小花费爬楼梯【简单】
后端·算法·leetcode·职场和发展·golang·记忆化搜索·动规
x70x802 天前
Go中nil的使用
开发语言·后端·golang
源代码•宸2 天前
Leetcode—47. 全排列 II【中等】
经验分享·后端·算法·leetcode·面试·golang·深度优先
漫漫求2 天前
Go的panic、defer、recover的关系
开发语言·后端·golang
Tony Bai2 天前
2025 Go 官方调查解读:91% 满意度背后的隐忧与 AI 时代的“双刃剑”
开发语言·后端·golang