面试题答案
一键面试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
}
上述代码工作原理如下:
- 定义了一个包级别的变量
dbPool
用于存储数据库连接池实例,once
是sync.Once
类型,用于确保初始化操作只执行一次。 GetDatabasePool
函数是对外暴露获取数据库连接池实例的接口。once.Do
方法接受一个函数作为参数,该函数会在第一次调用once.Do
时执行,后续再次调用once.Do
时,传入的函数不会再次执行。因此,dbPool
的初始化以及复杂的初始化操作只会执行一次,保证了在整个应用生命周期中数据库连接池只初始化一次。