内容简介:通常,在一个或多个项目中会有多种格式的配置文件,比如PHP的php.ini文件、Nginx的server.conf文件,那么使用Golang怎么去读取这些不同格式的配置文件呢?比如常见的有 JSON文件、INI文件、YAML文件和TOML文件等等。其中这些文件,对应的Golang处理库如下:通常情况下,推荐使用viper库来读取配置文件,虽然它不支持ini格式的配置文件,但我们可以使用goconfig 或gcfg.v1库读取ini 格式配置文件。
通常,在一个或多个项目中会有多种格式的配置文件,比如 PHP 的php.ini文件、Nginx的server.conf文件,那么使用Golang怎么去读取这些不同格式的配置文件呢?
比如常见的有 JSON文件、INI文件、YAML文件和TOML文件等等。其中这些文件,对应的Golang处理库如下:
- encoding/json – 标准库中的包,可以处理JSON配置文件,缺点是不能加注释
- gcfg&goconfig – 处理INI配置文件
- toml – 处理TOML配置文件
- viper – 处理JSON, TOML, YAML, HCL以及Java properties配置文件
通常情况下,推荐使用viper库来读取配置文件,虽然它不支持ini格式的配置文件,但我们可以使用goconfig 或gcfg.v1库读取ini 格式配置文件。
viper 支持以下功能:
- 支持Yaml、Json、 TOML、HCL 等格式的配置文件
- 可以从文件、 io.Reader 、环境变量、cli命令行读取配置
- 支持自动转换的类型解析
- 可以远程从Key/Value中读取配置,需要导入 viper/remote 包
- 监听配置文件。以往我们修改配置文件后需要重启服务生效,而Viper使用watch函数可以让配置自动生效。
安装viper
go get github.com/spf13/viper go get github.com/fsnotify/fsnotify
使用viper读取JSON配置文件
假设现在有一份 json 格式的配置文件 config.json
{ "date": "2019-04-30", "mysql": { "url": "127.0.0.1:3306", "username": "root", "password": "123456" } }
读取json配置文件
package main import ( "fmt" "github.com/spf13/viper" "os" ) func main() { viper.SetConfigName("config") //设置配置文件的名字 viper.AddConfigPath(".") //添加配置文件所在的路径 viper.SetConfigType("json") //设置配置文件类型,可选 err := viper.ReadInConfig() if err != nil { fmt.Printf("config file error: %s\n", err) os.Exit(1) } urlValue := viper.Get("mysql.url") fmt.Println("mysql url:", urlValue) fmt.Printf("mysql url: %s\n mysql username: %s\n mysql password: %s", viper.Get("mysql.url"), viper.Get("mysql.username"), viper.Get("mysql.password")) }
运行程序,查看效果
$ go run viper_json.go mysql url: 127.0.0.1:3306 mysql url: 127.0.0.1:3306 mysql username: root mysql password: 123456
使用viper读取yaml配置文件
假设现在有一份yaml格式的配置文件 config_yaml.yaml
port: 10666 mysql: url: "127.0.0.1:3306" username: root password: 123456
读取yaml配置文件
package main import ( "fmt" "github.com/spf13/viper" "github.com/fsnotify/fsnotify" "os" ) func main() { viper.SetConfigName("config_yaml") //把json文件换成yaml文件,只需要配置文件名 (不带后缀)即可 viper.AddConfigPath(".") //添加配置文件所在的路径 //viper.SetConfigType("json") //设置配置文件类型 err := viper.ReadInConfig() if err != nil { fmt.Printf("config file error: %s\n", err) os.Exit(1) } viper.WatchConfig() //监听配置变化 viper.OnConfigChange(func(e fsnotify.Event) { fmt.Println("配置发生变更:", e.Name) }) urlValue := viper.Get("mysql.url") fmt.Println("mysql url:", urlValue) fmt.Printf("mysql url: %s\nmysql username: %s\nmysql password: %s", viper.Get("mysql.url"), viper.Get("mysql.username"), viper.GetString("mysql.password")) }
viper其他重要功能
获取子级配置
当配置层级关系较多的时候,有时候我们需要直接获取某个子级的所有配置,可以这样操作:
app: cache1: max-items: 100 item-size: 64 cache2: max-items: 200 item-size: 80
如果要读取cache1下的max-items,只需要执行viper.Get(“app.cache1.max-items”)就可以了。
解析配置
可以将配置绑定到某个结构体、map上,有两个方法可以做到这一点:
Unmarshal(rawVal interface{}) : error UnmarshalKey(key string, rawVal interface{}) : error var config Config var mysql MySQL err := Unmarshal(&config) // 将配置解析到 config 变量 if err != nil { t.Fatalf("unable to decode into struct, %v", err) } err := UnmarshalKey("mysql", &mysql) // 将配置解析到 mysql 变量 if err != nil { t.Fatalf("unable to decode into struct, %v", err) }
获取值
在Viper中,有一些根据值的类型获取值的方法,存在以下方法:
Get(key string) : interface{} GetBool(key string) : bool GetFloat64(key string) : float64 GetInt(key string) : int GetString(key string) : string GetStringMap(key string) : map[string]interface{} GetStringMapString(key string) : map[string]string GetStringSlice(key string) : []string GetTime(key string) : time.Time GetDuration(key string) : time.Duration IsSet(key string) : bool
如果 Get 函数未找到值,则返回对应类型的一个零值。可以通过 IsSet() 方法来检测一个健是否存在。
viper.GetString("logfile") if viper.GetBool("verbose") { fmt.Println("verbose enabled") }
修改对应的配置
viper.Set("Verbose", true) viper.Set("LogFile", LogFile)
使用goconfig读取ini配置文件
安装goconfig
go get github.com/Unknwon/goconfig
假设database.conf配置文件,如下所示
[mysql] username=root password=123456 url=127.0.0.1:3306 [redis] address=127.0.0.1:6379
使用goconfig读取ini格式配置文件
package main import ( "fmt" "github.com/Unknwon/goconfig" "os" ) var cfg *goconfig.ConfigFile func init() { config, err := goconfig.LoadConfigFile("database.conf") //加载配置文件 if err != nil { fmt.Println("get config file error") os.Exit(-1) } cfg = config } func GlobalConfig() { glob, _ := cfg.GetSection("mysql") //读取全部mysql配置 fmt.Println(glob) } func main() { password, _ := cfg.GetValue("mysql", "password") //读取单个值 fmt.Println(password) username, _ := cfg.GetValue("mysql", "username") //读取单个值 fmt.Println(username) err := cfg.Reload() //重载配置 if err != nil { fmt.Printf("reload config file error: %s", err) } GlobalConfig() }
加载完全局配置后,该配置长驻内存,需要动态加载的话,使用cfg.Reload()方法。
运行程序,效果如下。
$ go run goconfig.go 123456 root map[password:123456 url:127.0.0.1:3306 username:root]
以上所述就是小编给大家介绍的《使用go读取配置文件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring Boot 2 实战:常用读取配置的方式
- Spring Boot读取配置文件的几种方式
- 原创 Wagon部署springboot项目读取配置文件错误问题
- Spring-boot读取properties/yaml配置文件
- Jboot 2.2.3 发布,完善文档并新增对加密配置内容读取的支持
- Java怎么从这四个位置读取配置文件Properties(普通文件系统-classpath-jar-URL)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
How to Build a Billion Dollar App
George Berkowski / Little, Brown Book Group / 2015-4-1 / USD 24.95
Apps have changed the way we communicate, shop, play, interact and travel and their phenomenal popularity has presented possibly the biggest business opportunity in history. In How to Build a Billi......一起来看看 《How to Build a Billion Dollar App》 这本书的介绍吧!