testonce.go
package main
import (
"fmt"
"sync"
"sync/atomic"
)
type singleton struct {
name string
}
var (
instance *singleton
initialized uint32
mu sync.Mutex
)
func Instance() *singleton {
if atomic.LoadUint32(&initialized) == 1 {
return instance
}
mu.Lock()
defer mu.Unlock()
if instance == nil {
defer atomic.StoreUint32(&initialized, 1)
instance = &singleton{name: "hello"}
}
return instance
}
/ 通用的代码提取出来,就成了标准库的Once
var (
instance2 *singleton
once sync.Once
)
func Instance2() *singleton {
once.Do(func() {
instance2 = &singleton{name: "world"}
})
return instance2
}
func main() {
obj := Instance()
fmt.Println(obj.name)
///
obj2 := Instance2()
fmt.Println(obj2.name)
}