MST
星途 面试题库

面试题:Go语言中sync.Once的基本使用场景是什么

请简述在Go语言里,sync.Once通常会用于哪些场景,并给出一个简单的代码示例展示其基本用法。
16.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

场景

  1. 单例模式实现:确保某个对象在整个应用程序生命周期内只被创建一次,避免重复创建带来的资源浪费和不一致问题。例如数据库连接池、配置对象等,只需要一个实例即可满足整个应用程序的需求。
  2. 初始化开销大的资源:像初始化一些全局变量、加载大型配置文件、建立复杂的网络连接等操作,这些操作往往开销较大,使用 sync.Once 可以保证这些操作只执行一次,后续调用直接使用已初始化的资源。

代码示例

package main

import (
    "fmt"
    "sync"
)

// singleton 定义单例结构体
type singleton struct {
    data string
}

var instance *singleton
var once sync.Once

// GetInstance 获取单例实例
func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{
            data: "Initial data",
        }
    })
    return instance
}

func main() {
    var wg sync.WaitGroup
    numRoutines := 10

    for i := 0; i < numRoutines; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            singleton := GetInstance()
            fmt.Println(singleton.data)
        }()
    }

    wg.Wait()
}

在上述代码中,sync.OnceDo 方法确保 instance 只会被初始化一次,即使多个 goroutine 同时调用 GetInstance 函数,也不会重复创建 instance