Viper--方便好用的Golang 配置库
Posted cnblogs-wangzhipeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Viper--方便好用的Golang 配置库相关的知识,希望对你有一定的参考价值。
前言
本文主要是为读者介绍一个轻便好用的Golang配置库viper
正文
viper 的功能
? viper 支持以下功能:
? 1. 支持Yaml、Json、 TOML、HCL 等格式的配置
? 2. 可以从文件、io、环境变量、command line中提取配置
? 3. 支持自动转换的类型解析
? 4. 可以远程从etcd中读取配置
示例代码
定义一个类型:
type config struct {
v *viper.Viper;
}
用于测试的Yaml配置文件
TimeStamp: "2018-07-16 10:23:19"
Author: "WZP"
PassWd: "Hello"
Information:
Name: "Harry"
Age: "37"
Alise:
- "Lion"
- "NK"
- "KaQS"
Image: "/path/header.rpg"
Public: false
Favorite:
Sport:
- "swimming"
- "football"
Music:
- "zui xuan min zu feng"
LuckyNumber: 99
读取yaml配置文件
func LoadConfigFromYaml (c *config) error {
c.v = viper.New();
//设置配置文件的名字
c.v.SetConfigName("config")
//添加配置文件所在的路径,注意在Linux环境下%GOPATH要替换为$GOPATH
c.v.AddConfigPath("%GOPATH/src/")
c.v.AddConfigPath("./")
//设置配置文件类型
c.v.SetConfigType("yaml");
if err := c.v.ReadInConfig(); err != nil{
return err;
}
log.Printf("age: %s, name: %s
", c.v.Get("information.age"), c.v.Get("information.name"));
return nil;
}
? 注意:如果不用AddConfigPath去指定路径,它会在程序执行的目录去寻找config.yaml
从IO中读取配置
//由IO读取配置
func ReadConfigFormIo(c *config) error {
c.v = viper.New()
if f, err := os.Open("config.yaml"); err != nil{
log.Printf("filure: %s", err.Error());
return err;
}else {
confLength, _ :=f.Seek(0,2);
//注意,通常写c++的习惯害怕读取字符串的时候越界,都会多留出一个NULL在末尾,但是在这里不行,会报出如下错误:
//While parsing config: yaml: control characters are not allowed
//错误参考网址:https://stackoverflow.com/questions/33717799/go-yaml-control-characters-are-not-allowed-error
configData := make([]byte, confLength);
f.Seek(0, 0);
f.Read(configData);
log.Printf("%s
", string(configData))
c.v.SetConfigType("yaml");
if err := c.v.ReadConfig(bytes.NewBuffer(configData)); err != nil{
log.Fatalf(err.Error());
}
}
log.Printf("age: %s, name: %s
", c.v.Get("information.age"), c.v.Get("information.name"));
return nil;
}
? 上面的代码是把配置文件中的数据导入IO,然后再从IO中读取
以上是关于Viper--方便好用的Golang 配置库的主要内容,如果未能解决你的问题,请参考以下文章