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 变量只会被初始化一次。

相关推荐
microrain1 天前
读数是 1008,用电量是 8:SagooIoT 计算服务的增量口径与七种计算策略
物联网·golang·计算服务·sagooiot
看浪的路人1 天前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
灯澜忆梦1 天前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
不是万能的豆学长1 天前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
tachibana21 天前
Go 语言 Map 的底层实现原理
开发语言·后端·golang·make
tachibana21 天前
Go语言里slice是怎么扩容的?
后端·golang·go·切片
西瓜很甜哟1 天前
golang实现大文件分片上传
后端·golang·html
tachibana22 天前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
王中阳Go2 天前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
for_ever_love__2 天前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索