面试题答案
一键面试场景
- 单例模式实现:确保某个对象在整个应用程序生命周期内只被创建一次,避免重复创建带来的资源浪费和不一致问题。例如数据库连接池、配置对象等,只需要一个实例即可满足整个应用程序的需求。
- 初始化开销大的资源:像初始化一些全局变量、加载大型配置文件、建立复杂的网络连接等操作,这些操作往往开销较大,使用
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.Once
的 Do
方法确保 instance
只会被初始化一次,即使多个 goroutine 同时调用 GetInstance
函数,也不会重复创建 instance
。