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