ZBLOG

golang 如何让sync.once执行两次

使用 sync.Once 可以保证一个函数只会被执行一次,如果需要让该函数执行两次,可以通过以下方式实现:

  1. 使用 sync.Mutex 来控制 once 对象的状态,使其重新变为未执行过状态。
  1. var once sync.Once
  2. var mu sync.Mutex
  3. func doTwice() {
  4. mu.Lock()
  5. defer mu.Unlock()
  6. // 强制设置 once 状态为未执行过
  7. once = sync.Once{}
  8. once.Do(func() {
  9. fmt.Println("Hello")
  10. })
  11. once.Do(func() {
  12. fmt.Println("World")
  13. })
  14. }
  1. 直接使用 reflect 修改 once 对象的状态,使其重新变为未执行过状态。
  1. import (
  2. "reflect"
  3. "sync"
  4. )
  5. func doTwice() {
  6. once := &sync.Once{}
  7. once.Do(func() {
  8. fmt.Println("Hello")
  9. })
  10. // 通过反射修改 once 对象的 done 字段
  11. v := reflect.ValueOf(once).Elem()
  12. v.FieldByName("done").SetBool(false)
  13. once.Do(func() {
  14. fmt.Println("World")
  15. })
  16. }

注意:这两种方法都是 hack 的做法,不建议在生产环境中使用。最好的解决方案是将需要执行多次的代码抽取成函数,并在需要执行多次的地方手动调用该函数。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=715

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?