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
 

 

 

posted @ 2019-07-10 16:30  易云客  阅读(7963)  评论(0编辑  收藏  举报