加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Viper--方便好用的Golang 配置库

发布时间:2020-12-16 09:34:17 所属栏目:大数据 来源:网络整理
导读:前言 本文主要是为读者介绍一个轻便好用的Golang配置库viper 正文 viper 的功能 ? viper 支持以下功能: ? 1. 支持Yaml、Json、 TOML、HCL 等格式的配置 ? 2. 可以从文件、io、环境变量、command line中提取配置 ? 3. 支持自动转换的类型解析 ? 4. 可以远程

前言


本文主要是为读者介绍一个轻便好用的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 n",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("%sn",string(configData))

        c.v.SetConfigType("yaml");
        if err := c.v.ReadConfig(bytes.NewBuffer(configData)); err != nil{
            log.Fatalf(err.Error());
        }
    }
    log.Printf("age: %s,c.v.Get("information.name"));

    return nil;
}

? 上面的代码是把配置文件中的数据导入IO,然后再从IO中读取

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读