Go语言中单例模式once.Do只执行一次


package singleton

import (
    "unsafe"
    "fmt"
    "sync"
    "testing"
)

//协程安全 单例模式
type Singleton struct {
}

var singleintance *Singleton
var once sync.Once

//只执行一次
func GetSingletonObj() *Singleton {
    once.Do(func() {
        fmt.Println("Create Obj")
        singleintance = new(Singleton)
    })
    return singleintance
}

func TestGetSingletonObj(t *testing.T) {
    var wg sync.WaitGroup //协程安全
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            obj := GetSingletonObj()
            fmt.Printf("%x\n",unsafe.Pointer(obj))//输出的结果都是同一个地址
            wg.Done()
        }()
    }
    wg.Wait() //等待是有协程运行完成
}

 

使用noce.Do调用时方法内执行代码只执行一次。

输出结果:

Create Obj

6c7df8
6c7df8
6c7df8
6c7df8
6c7df8
6c7df8
6c7df8
6c7df8
 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM