Go中用指针共享配置对象,即多个组件持有同一配置地址,实现修改一处、全局生效;需启动时初始化指针,避免函数内重赋值,推荐依赖注入而非全局变量,并注意并发安全与原地更新。
用 Go 指针共享配置对象,核心是让多个组件持有同一份配置的地址,而非各自拷贝一份值。这样修改一处,所有引用它的地方立即生效,适合运行时动态更新或全局统一管理的场景。
定义一个配置结构体,初始化后取其地址传给其他函数或结构体字段。Go 中结构体默认按值传递,必须显式用 & 取地址才能共享。
cfg = &Config{...}),否则会切断原有引用
安全写入type Config struct { Port int; Env string }
cfg := &Config{Port: 8080, Env: "dev"}
server := NewServer(cfg) // 传指针
logger := NewLogger(cfg) // 同一地址
可声明包级变量保存配置指针,方便跨文件访问,但要注意并发安全和初始化顺序。
var GlobalConfig *Config 声明,配合 init() 或显式 LoadConfig() 初始化sync.RWMutex 保护写操作var Config *Config),应封装为函数(func GetConfig() *Config)控制访问更推荐把配置指针作为参数注入到服务对象中,提高可测试性和解耦度。
*Config,存为结构体字段type APIServer struct { cfg *Config }
func NewAPIServer(cfg *Config) *APIServer {
return &APIServer{cfg: cfg}
}
若需热更新配置,不要直接替换整个指针(GlobalConfig = newCfg),而应原地更新字段,并加锁保证可见性。
cfg.Port = 9090 —— 安全,前提是无竞态atomic.Value 存储指针(适合完全替换配置实例)基本上就这些。指针共享配置不复杂但容易忽略生命周期和并发问题,关键是始终明确谁拥有配置内存、谁负责初始化、谁允许修改。