Go基础(②Viper)
Viper 读取配置
创建一个配置文件 config.yaml
server:port: 8080timeout: 30 # 超时时间(秒)
database:host: "localhost"user: "root"password: "123456"name: "mydb"
然后用 Viper 读取这个配置,代码如下:
package mainimport ("fmt""log""github.com/spf13/viper"
)func main() {// 1. 告诉 Viper 配置文件在哪viper.SetConfigFile("config.yaml") // 指定配置文件// 2. 读取配置文件err := viper.ReadInConfig()if err != nil {log.Fatalf("配置文件读不了:%v", err)}// 3. 读取具体配置项serverPort := viper.GetInt("server.port") // 读服务器端口dbHost := viper.GetString("database.host") // 读数据库地址dbPassword := viper.GetString("database.password") // 读数据库密码// 4. 使用配置fmt.Printf("服务器将启动在 %d 端口\n", serverPort)fmt.Printf("将连接数据库:%s@%s\n", dbHost, dbPassword)// 5. 演示:设置默认值(如果配置文件没写,就用这个)viper.SetDefault("server.debug", false)isDebug := viper.GetBool("server.debug")fmt.Printf("是否开启调试模式:%v\n", isDebug)
}
动态监听配置
Viper 支持动态监听配置文件变化,不用重启程序就能感知到 config.yaml
的修改并应用新配置。
package mainimport ("fmt""log""time""github.com/fsnotify/fsnotify""github.com/spf13/viper"
)func main() {// 1. 配置 Viper 读取 config.yamlviper.SetConfigFile("config.yaml")if err := viper.ReadInConfig(); err != nil {log.Fatalf("无法读取配置文件: %v", err)}// 2. 打印初始配置printCurrentConfig()// 3. 启动配置监听(关键代码)viper.WatchConfig()// 4. 注册配置变化的回调函数(配置修改后会自动执行)viper.OnConfigChange(func(e fsnotify.Event) {fmt.Println("\n配置文件被修改了!路径:", e.Name)// 重新打印配置,查看变化printCurrentConfig()})// 让程序保持运行,方便测试fmt.Println("\n程序正在运行,尝试修改 config.yaml 看看效果...")for {time.Sleep(time.Second)}
}// 打印当前配置的函数
func printCurrentConfig() {port := viper.GetInt("server.port")debug := viper.GetBool("server.debug")dbHost := viper.GetString("database.host")fmt.Printf("当前配置:端口=%d, 调试模式=%v, 数据库地址=%s\n", port, debug, dbHost)
}
运行程序,初始会打印配置
不要关闭程序,手动修改 config.yaml 中的内容(比如把 port: 8080 改成 port: 9090)
保存文件后,程序会立刻输出 "配置文件被修改了",并显示新的配置值