47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
dbConfig string // 需要初始化的配置
|
|
once sync.Once // 单例执行工具
|
|
initErr error // 存储初始化错误(通过闭包传递)
|
|
wg3 sync.WaitGroup
|
|
)
|
|
|
|
// 初始化配置(可能失败)
|
|
func initConfig() error {
|
|
fmt.Println("开始初始化配置...")
|
|
time.Sleep(1 * time.Second) // 模拟耗时
|
|
// 模拟初始化失败(可注释此行测试成功场景)
|
|
//return errors.New("配置文件不存在")
|
|
dbConfig = "db:localhost:3306"
|
|
return nil
|
|
}
|
|
|
|
// 获取配置(触发初始化)
|
|
func getConfig(workerID int) {
|
|
defer wg3.Done()
|
|
once.Do(func() {
|
|
initErr = initConfig() // 错误通过闭包捕获
|
|
})
|
|
if initErr != nil {
|
|
fmt.Printf("工作者%d: 配置初始化失败: %v\n", workerID, initErr)
|
|
return
|
|
}
|
|
fmt.Printf("工作者%d: 获取配置=%s\n", workerID, dbConfig)
|
|
}
|
|
|
|
func main() {
|
|
// 5个goroutine同时尝试获取配置(触发初始化)
|
|
for i := 0; i < 5; i++ {
|
|
wg3.Add(1)
|
|
go getConfig(i)
|
|
}
|
|
wg3.Wait()
|
|
}
|