MST

星途 面试题库

面试题:Go 中 sync.Once 在简单并发场景下的应用

假设有一个复杂的初始化操作,例如初始化数据库连接池,要求在整个应用生命周期中只执行一次。请使用 Go 的 sync.Once 来实现这个需求,并解释代码的工作原理。
41.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

var (
    dbPool *DatabasePool
    once   sync.Once
)

// DatabasePool 代表数据库连接池
type DatabasePool struct {
    // 这里可以定义连接池相关的字段
}

// GetDatabasePool 获取数据库连接池实例
func GetDatabasePool() *DatabasePool {
    once.Do(func() {
        dbPool = &DatabasePool{}
        // 这里执行复杂的初始化操作,比如真正初始化连接池
        fmt.Println("初始化数据库连接池")
    })
    return dbPool
}

上述代码工作原理如下:

  1. 定义了一个包级别的变量 dbPool 用于存储数据库连接池实例,oncesync.Once 类型,用于确保初始化操作只执行一次。
  2. GetDatabasePool 函数是对外暴露获取数据库连接池实例的接口。
  3. once.Do 方法接受一个函数作为参数,该函数会在第一次调用 once.Do 时执行,后续再次调用 once.Do 时,传入的函数不会再次执行。因此,dbPool 的初始化以及复杂的初始化操作只会执行一次,保证了在整个应用生命周期中数据库连接池只初始化一次。