GO sync.Once

需求

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

 

实现

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

posted @ 2022-02-12 13:46  jihite  阅读(66)  评论(0编辑  收藏  举报