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