golang代码实例库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6094|回复: 0

golang:使用sync.Once保证指定操作只会执行一次

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
486
发表于 2021-12-17 23:44:57 | 显示全部楼层 |阅读模式
实例说明

有时候,我们需要某项任务只执行一次,但如果是在多协程环境中,自己控制则不太好操作,这个时候我们可以使用sync.Once来执行相关操作
1)使用sync.Once保证指定操作只会执行一次
2)即使是在多协程环境中,也保证执行一次
3)once控制的是自己,所以如果once执行过一次了,计算下次换个函数执行,这个新函数也一次不会执行,因为once执行过了
4)once执行方法无参数,无返回值,可以通过闭包的方式传递参数和返回值

实例代码
[Golang] 纯文本查看 复制代码
package main

import (
        "fmt"
        "sync"
)

func main() {
        // 定义两个once,可以控制两个方法只执行一次
        // 也就是说,一个once,控制的是自己只执行一次,不管里面有多少个方法
        var once1 sync.Once
        var once2 sync.Once

        hello := "hello world"
        result := ""
        // 虽然在循环中,但下面方法,只执行一次
        for i := 0; i < 10; i++ {
                // once.Do中执行方法要求无参数和返回值
                // 我们可以使用闭包的方式传递参数和返回值
                once1.Do(func() {
                        // 通过闭包,使用外面参数
                        fmt.Println(hello)
                        result = "你好,中国"
                })
        }
        fmt.Println(result)
        // 输出:你好,中国

        //
        for i := 0; i < 10; i++ {
                // 注意:这里使用的是once1,因为上面once1已经执行过一次了,虽然这里执行的匿名方法变了,但因为once控制的是自己,
                // 所以,这里的方法不会执行
                once1.Do(func() {
                        fmt.Println("hello world 1")
                })

                // 多协程环境中,也可以保证once中执行的方法只会执行一次
                go func() {
                        once2.Do(func() {
                                fmt.Println("hello world 2")
                        })
                }()
        }
}

// 最终输出
// hello world
// 你好,中国
// hello world 2




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|golang代码实例库 ( 粤ICP备2021162396号 )

GMT+8, 2025-5-17 10:01 , Processed in 0.018858 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表