下面代码中 f()会被重复执行吗?

package main

import (
	"fmt"
	"sync"
)

type Once struct {
	m    sync.Mutex
	done uint32
}

func (o *Once) Do(f func()) {
	if o.done == 1 {
		return
	}

	o.m.Lock()
	defer o.m.Unlock()

	fmt.Println("bing: ", o.done)

	if o.done == 0 {
		o.done = 1
		f()
	}
}

func main() {
	var once Once
	wg := sync.WaitGroup{}

	wg.Add(100)
	for i := 0; i < 100; i++ {
		go func() {
			defer wg.Done()
			once.Do(func() {
				println("executed---------》 ")
			})
		}()
	}
	wg.Wait()
}


举报· 445 次点击
登录 注册 站外分享
3 条回复  
ccpp132 小成 2026-1-7 19:32:43
不会
YanSeven 初学 2026-1-7 19:46:32
额,你这个 demo 不都已经写好了,go run 一下立马知道。
unused 初学 2026-1-7 20:19:03
不会,但是不能保证 Do() 返回时 f() 已经执行
返回顶部