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 \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("%s\n", 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 \n", c.v.Get("information.age"), c.v.Get("information.name"));

    return nil;
}

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

原文地址:https://www.cnblogs.com/cnblogs-wangzhipeng/p/9484460.html

时间: 2024-10-13 06:48:42

Viper--方便好用的Golang 配置库的相关文章

Golang中使用log(一):Golang 标准库提供的Log

Golang的标准库提供了log的机制,但是该模块的功能较为简单(看似简单,其实他有他的设计思路).不过比手写fmt. Printxxx还是强很多的.至少在输出的位置做了线程安全的保护.其官方手册见Golang log (天朝的墙大家懂的).这里给出一个简单使用的例子: package main import ( "log" ) func main(){ log.Fatal("Come with fatal,exit with 1 \n") } 编译运行后,会看到程

Golang标准库之Buffer

Buffer Go标准库Buffer是一个可变大小的字节缓冲区,可以用Wirte和Read方法操作它,在Go标准库中,定义了如下关于Buffer的数据结构. type Buffer struct { buf []byte // contents are the bytes buf[off : len(buf)] off int // read at &buf[off], write at &buf[len(buf)] runeBytes [utf8.UTFMax]byte // avoid

混合使用TFVC和GIT配置库的优化方案

如果要选出最近几年在软件工程领域最热的技术,那毋庸置疑就是git了.作为分布式源代码管理(DVCS)的代表,git以其超快的操作,便捷的分支合并模型和P2P模式的代码分享模式让软件开发团队的很多复杂协作成为可能,也大大提高了开发团队的效率.虽然如此,集中式的源代码管理(CVCS)仍然在很多大型软件团队中使用,这其中自然有历史原因,但集中式源代码控制所具备的很多特性也是分布式所不具备的,比如:代码资产的安全性,细化到文件级别的权限管理能力(使用某些插件或者hook,git也可以做到,但这不是git

Golang中使用log(二):Golang 标准库log的实现

前一篇文章我们看到了Golang标准库中log模块的使用,那么它是如何实现的呢?下面我从log.Logger开始逐步分析其实现. 其源码可以参考官方地址 1.Logger结构 首先来看下类型Logger的定义: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write at beginning of each

【学习笔记】信息系统项目管理-配置管理-配置库分类

配置库也称为配置项库.用来存放配置项的工具.主要分为下面三类. 1.开发库 development library 存放开发过程中须要保留的信息.供开发者专用. 库中信息可能较为频繁的改动.这通常不会影响到项目的其他部分. 2.受控库 controlled library 在某个阶段工作结束时,将工作产品存入或将有关的信息存入. 应该对库中信息的读写和改动加以控制. 3.产品库 product library 在开发的产品完毕系统測试后,将终于产品存入库中,等待交付.库中的信息应该加以控制.

创建虚拟环境 激活虚拟环境 配置库

创建虚拟环境 cmd去到你的工作目录E:\. 创建虚拟环境, 运行命令: [email protected] MINGW64 /e$ virtualenv env_mysiteNew python executable in E:\env_mysite\Scripts\python.exeInstalling setuptools, pip, wheel...done. 激活虚拟环境  配置库 安装好虚拟环境后,此时ENV只是一个出装的python而已,如果需要这个环境满你的App的库的需求,还

Emacs golang 配置

在配置前需要下载用到的包: godoc godef gocode oracle 在下载包之前需要设置好环境变量: # Golang export GOROOT=$HOME/go export GOPATH=$HOME/development/go export PATH=$PATH:$GOROOT/bin export PATH=$PATH:$GOPATH/bin 如果网络良好的话使用这种方法:godoc: go get golang.org/x/tools/cmd/godoc 这样会将godo

golang标准库文档

Golang标准库文档 https://studygolang.com/pkgdoc go中文官网 https://go-zh.org/doc/ <Go Web 基础>是一套针对 Google 出品的 Go 语言的视频语音教程,主要面向完成 <Go 编程基础>有关 Go Web 开发的学习者. Unknwon/go-web-foundation <Go 编程基础>主要面向新手级别的学习者.Unknwon/go-fundamental-programming <Go

[开源] gnet: 一个轻量级且高性能的 Golang 网络库

Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库.这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似于两个开源的网络库:libuv 和 libevent. 这个项目存在的价值是提供一个在网络包处理方面能和 Redis.Hap