/
viper1.go
65 lines (51 loc) · 1.14 KB
/
viper1.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main
import (
"fmt"
"log"
"sync"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type AppConfig struct {
sync.RWMutex
App struct {
Name string `mapstructure:"name"`
Version float64 `mapstructure:"version"`
} `mapstructure:"app"`
}
var appConfig *AppConfig
func main() {
viper.SetConfigFile("config.yaml")
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("Error reading config file: %s", err)
}
appConfig = &AppConfig{}
updateConfig()
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
updateConfig()
})
// 模拟多个并发读取配置的 goroutine
for i := 0; i < 10; i++ {
go func() {
for {
printConfig()
}
}()
}
// 阻塞主 goroutine,以便其他 goroutine 可以继续运行
select {}
}
func updateConfig() {
appConfig.Lock()
defer appConfig.Unlock()
if err := viper.Unmarshal(appConfig); err != nil {
log.Fatalf("Error unmarshalling config: %s", err)
}
}
func printConfig() {
appConfig.RLock()
defer appConfig.RUnlock()
fmt.Printf("App Name: %s, Version: %f\n", appConfig.App.Name, appConfig.App.Version)
}