需求

高并发场景下,操作只执行一次,如读取配置、单例模式

 

实现

Go 的sync模块提供了只执行一次的解决方案:sync.Once, 它只有一个函数:Do

func (o *Once) Do(f func()) {}

 

示例1:读取一次配置文件

package main

import (
"fmt"
"sync"
)

var once sync.Once
var mconfig map[string]string

func loadConfig(){
mconfig = map[string]string{
"aa": "aa_1",
"bb": "bb_2",
}
}

func _109_test2() {
once.Do(loadConfig)
fmt.Println(mconfig["aa"])
fmt.Println(mconfig["aaa"])
fmt.Println("Done")

}

func main() {
_109_test2()
}

执行:

aa_1

Done

 

示例2:单例模式

package main

import (
"fmt"
"sync"
)

type singleton struct{
name string
age int
}

var instance *singleton
var once sync.Once

func getInstance() *singleton {
once.Do(func() {
instance = &singleton{"jihite", 18}
})
return instance
}

func _109_test1() {
s := getInstance()
fmt.Println(s.name, s.age)
}

func main() {
_109_test1()
}

执行:

jihite 18