golang中once的应用范围验证

把once设置为全局变量

var once sync.Once

func main() {
    onceFunc()
    onceFunc()
}

func onceFunc() {

    func1 := func() {
        fmt.Println("fun1")
    }
    once.Do(func1)

    func2 := func() {
        fmt.Println("fun2")
    }
    once.Do(func2)
}

 

输出为:

fun1

 

再把once设置为局部变量

func main() {
	onceFunc()
	onceFunc()
}

func onceFunc() {
	var once sync.Once
	func1 := func() {
		fmt.Println("fun1")
	}
	once.Do(func1)

	func2 := func() {
		fmt.Println("fun2")
	}
	once.Do(func2)
}  

输出结果为

fun1
fun1

 

同一个 once,仅第一次 Do(f) 中的 f 会被执行,第二次哪怕换成 Do(f1),f1 也不会被执行。

 

posted @ 2022-08-17 15:11  liujw2001  阅读(123)  评论(0)    收藏  举报