今天向大家介绍一个关于Go读取配置文件的相关Tool,他就是:Viper
GitHub链接:https://github.com/spf13/viper/
1 简介
Viper是一个完整的配置解决方案,包括12因素应用程序。它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:
- 设置默认值
- 读取JSON, TOML, YAML, HCL, envfile和Java属性配置文件
- 实时观看和读取配置文件(可选)
- 从环境变量中读取
- 读取远程配置系统(etcd或Consul),并观察变化
- 从命令行标志中读取
- 从缓冲区读取
- 设置显式值
Viper可以将其视为满足所有应用程序配置需求的注册表。
2 准备阶段
2.1 新建Go module,引入viper
go get github.com/spf13/viper
2.2 项目目录
3 开始使用
3.1 读取ini格式文件
文件内容:
[base] name=ymx
代码:
package main import ( "fmt" "github.com/spf13/viper" ) func main() { viper.SetConfigName("my") // 文件名 (没有后缀的) viper.SetConfigType("ini") // 文件类型(文件合理的后缀名) viper.AddConfigPath("./ini_file") // 文件的目录,支持表达式,也可以增加多个 err := viper.ReadInConfig() // 对文件进行读取 if err != nil { // 读取文件失败 panic(fmt.Errorf("Fatal error config file: %w \n", err)) } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("没有找到配置文件") } else { fmt.Println("找到配置文件,但产生了另一个错误") } } // 找到并成功解析了配置文件 for i := range viper.AllKeys() { fmt.Println(viper.AllKeys()[i]) fmt.Println(viper.Get(viper.AllKeys()[i])) } }
输出结果:
3.2 读取yaml格式文件
文件内容:
server: port: 8080
代码:
package main import ( "fmt" "github.com/spf13/viper" ) func main() { viper.SetConfigName("my") // 文件名 (没有后缀的) viper.SetConfigType("yaml") // 文件类型(文件合理的后缀名) viper.AddConfigPath("./yaml_file") // 文件的目录,支持表达式,也可以增加多个 err := viper.ReadInConfig() // 对文件进行读取 if err != nil { // 读取文件失败 panic(fmt.Errorf("Fatal error config file: %w \n", err)) } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("没有找到配置文件") } else { fmt.Println("找到配置文件,但产生了另一个错误") } } // 找到并成功解析了配置文件 for i := range viper.AllKeys() { fmt.Println(viper.AllKeys()[i]) fmt.Println(viper.Get(viper.AllKeys()[i])) } }
输出结果:
3.3 读取properties格式文件
文件内容:
server.port=2000
代码:
package main import ( "fmt" "github.com/spf13/viper" ) func main() { viper.SetConfigName("my") // 文件名 (没有后缀的) viper.SetConfigType("properties") // 文件类型(文件合理的后缀名) viper.AddConfigPath("./properties_file") // 文件的目录,支持表达式,也可以增加多个 err := viper.ReadInConfig() // 对文件进行读取 if err != nil { // 读取文件失败 panic(fmt.Errorf("Fatal error config file: %w \n", err)) } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("没有找到配置文件") } else { fmt.Println("找到配置文件,但产生了另一个错误") } } // 找到并成功解析了配置文件 for i := range viper.AllKeys() { fmt.Println(viper.AllKeys()[i]) fmt.Println(viper.Get(viper.AllKeys()[i])) } }
输出结果:
3.4 读取json格式文件
文件内容:
{ "id": 1, "name": "ymx" }
代码:
package main import ( "fmt" "github.com/spf13/viper" ) func main() { viper.SetConfigName("my") // 文件名 (没有后缀的) viper.SetConfigType("json") // 文件类型(文件合理的后缀名) viper.AddConfigPath("./json_file") // 文件的目录,支持表达式,也可以增加多个 err := viper.ReadInConfig() // 对文件进行读取 if err != nil { // 读取文件失败 panic(fmt.Errorf("Fatal error config file: %w \n", err)) } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("没有找到配置文件") } else { fmt.Println("找到配置文件,但产生了另一个错误") } } // 找到并成功解析了配置文件 keys := viper.AllKeys() for i := range keys { fmt.Println(keys[i]) fmt.Println(viper.Get(keys[i])) } }
输出结果: