当前位置: 首页 > news >正文

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)
保存文件后,程序会立刻输出 "配置文件被修改了",并显示新的配置值

http://www.xdnf.cn/news/1478503.html

相关文章:

  • 安装MATLAB205软件记录
  • 【Linux】Linux环境基础开发工具使用
  • clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性
  • Nginx停止脚本命令
  • 性能优化的边界-不该优化什么
  • PostgreSQL三种关闭方式的区别
  • 详解文件操作
  • 数据库集群分类详解
  • 【Java】抽象类和接口对比+详解
  • Altium Designer(AD24)加载License文件方法
  • 计算机CPU的工作原理介绍
  • 抽成独立组件库:微前端架构下公共组件共享的最佳实践
  • MyBatis Example模式SQL注入风险
  • C#中一段程序类比博图
  • 【完整源码+数据集+部署教程】水培植物病害检测系统源码和数据集:改进yolo11-AKConv
  • 从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
  • 【科研成果速递-IJGIS】如何描述与分类移动对象的时空模式?一个新的分类框架与体系!
  • JDBC操作数据库所需要的组件
  • 《Kubernetes 构建 MySQL MGR 集群实战教程》
  • 使用Spring Boot DevTools快速重启功能
  • Python爬虫实战:研究Event Handling机制,构建在线教育平台的课程数据采集和分析系统
  • 使用 YAML 自动化 Azure DevOps 管道
  • browser-use 的三种启动方式详解
  • Android Framework智能座舱面试题
  • 【Python自动化】 21.2 Pandas 读取 Excel 时的 dtype 参数完全指南
  • 贪心算法应用:DNA自组装问题详解
  • Flask论坛与个人中心页面开发教程完整详细版
  • 【LeetCode 热题 100】49. 字母异位词分组
  • Windows 11 手动下载安装配置 uv、配置国内源
  • 固定资产管理系统(vue+Springboot+mybatis)