MST

星途 面试题库

面试题:Go语言中sync.Once在服务启动场景下如何确保单例初始化

假设你正在开发一个Go语言的服务,其中有一个全局的配置对象需要在服务启动时进行初始化,且只初始化一次。请使用sync.Once来实现这个需求,并解释代码中sync.Once的关键操作及其作用。
16.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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关键操作及其作用

  1. once.Do(func())
    • 操作Do方法接受一个无参数无返回值的函数作为参数。如果once对象的Do方法第一次被调用,传入的函数会被执行,且只会执行一次。无论后续Do方法被调用多少次,传入的函数都不会再次执行。
    • 作用:保证了全局配置对象config只会被初始化一次,避免了多次初始化可能带来的资源浪费和数据不一致问题,在并发环境下也能保证初始化的原子性和唯一性。在Go语言开发的服务中,对于像全局配置对象这样只需要初始化一次的场景,sync.Once提供了简单且高效的解决方案。