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