package main
import (
"fmt"
"sync"
)
// 定义全局配置对象
var config *Config
var once sync.Once
// Config 结构体表示配置
type Config struct {
// 这里可以添加配置项,例如:
ServerAddr string
}
// GetConfig 获取配置对象
func GetConfig() *Config {
once.Do(func() {
config = &Config{
ServerAddr: "127.0.0.1:8080",
}
})
return config
}
sync.Once
关键操作及其作用
once.Do(func())
:
- 操作:
Do
方法接受一个无参数无返回值的函数作为参数。如果once
对象的Do
方法第一次被调用,传入的函数会被执行,且只会执行一次。无论后续Do
方法被调用多少次,传入的函数都不会再次执行。
- 作用:保证了全局配置对象
config
只会被初始化一次,避免了多次初始化可能带来的资源浪费和数据不一致问题,在并发环境下也能保证初始化的原子性和唯一性。在Go语言开发的服务中,对于像全局配置对象这样只需要初始化一次的场景,sync.Once
提供了简单且高效的解决方案。