• 技术文章 >后端开发 >Golang

    分享Golang中一个好用的viper配置模块

    藏色散人藏色散人2021-07-09 14:59:01转载102

    前言

    viper 支持Yaml、Json、 TOML、HCL 等格式,读取非常的方便。

    安装

    go get github.com/spf13/viper

    如果提示找不到golang.org/x/text/这个库,是因为golang.org/x/text/这个库在GitHub上托管的路径不一致。

    解决办法:

    可以从https://github.com/golang/text下载源码下来,然后到$GOPATH/src下面创建golang.org/x/文件夹(已存在的忽略),把压缩包的文件解压到golang.org/x/文件夹之下。

    然后执行 go install -x golang.org/x/text 即可解决:

    正文

    初始结构目录如下:

    准备测试使用的yaml文件,注意yaml的格式十分严格,主要是每个冒号后面必须要有空格,数组前要加“-”号表示连续(注意减号后面也有空格),内容如下:

    TimeStamp: "2018-10-18 10:09:23"
    Address: "Shenzhen"
    Postcode: 518000
    CompanyInfomation:
      Name: "Sunny"
      MarketCapitalization: 50000000
      EmployeeNum: 200
      Department:
        - "Finance"
        - "Design"
        - "Program"
        - "Sales"
      IsOpen: false

    读取yaml文件:

    package main
    
    import (
    	"github.com/spf13/viper"
    	"fmt"
    )
    
    func main() {
    	//读取yaml文件
    	v := viper.New()
    	//设置读取的配置文件
    	v.SetConfigName("linux_config")
    	//添加读取的配置文件路径
    	v.AddConfigPath("./config/")
    	//windows环境下为%GOPATH,linux环境下为$GOPATH
    	v.AddConfigPath("$GOPATH/src/")
    	//设置配置文件类型
    	v.SetConfigType("yaml")
    
    	if err := v.ReadInConfig();err != nil {
    		fmt.Printf("err:%s\n",err)
    	}
    
    	fmt.Printf(
    		`
    		TimeStamp:%s
    		CompanyInfomation.Name:%s
    		CompanyInfomation.Department:%s `,
    		v.Get("TimeStamp"),
    		v.Get("CompanyInfomation.Name"),
    		v.Get("CompanyInfomation.Department"),
    	)
    
    	/*
    	result:
    	TimeStamp:2018-10-18 10:09:23
    	CompanyInfomation.Name:Sunny
    	CompanyInfomation.Department:[Finance Design Program Sales]
    	*/
    
    	
    }

    也可以直接反序列化为Struct,非常的方便:

    package main
    
    import (
    	"github.com/spf13/viper"
    	"fmt"
    )
    
    func main() {
    	//读取yaml文件
    	v := viper.New()
    	//设置读取的配置文件
    	v.SetConfigName("linux_config")
    	//添加读取的配置文件路径
    	v.AddConfigPath("./config/")
    	//windows环境下为%GOPATH,linux环境下为$GOPATH
    	v.AddConfigPath("$GOPATH/src/")
    	//设置配置文件类型
    	v.SetConfigType("yaml")
    
    	if err := v.ReadInConfig();err != nil {
    		fmt.Printf("err:%s\n",err)
    	}
    
    	fmt.Printf(
    		`
    		TimeStamp:%s
    		CompanyInfomation.Name:%s
    		CompanyInfomation.Department:%s `,
    		v.Get("TimeStamp"),
    		v.Get("CompanyInfomation.Name"),
    		v.Get("CompanyInfomation.Department"),
    	)
    
    	/*
    	result:
    	TimeStamp:2018-10-18 10:09:23
    	CompanyInfomation.Name:Sunny
    	CompanyInfomation.Department:[Finance Design Program Sales]
    	*/
    
    	//反序列化
    	parseYaml(v)
    
    }
    
    type CompanyInfomation struct{
    	Name string
    	MarketCapitalization int64
    	EmployeeNum int64
    	Department []interface{}
    	IsOpen bool
    }
    
    type YamlSetting struct{
    	TimeStamp string
    	Address string
    	Postcode int64
    	CompanyInfomation CompanyInfomation
    }
    
    
    func parseYaml(v *viper.Viper){
    	var yamlObj YamlSetting;
    	if err := v.Unmarshal(&yamlObj) ; err != nil{
    		fmt.Printf("err:%s",err)
    	}
    	fmt.Println(yamlObj)
    	/*
    	result:
    	{2018-10-18 10:09:23 Shenzhen 518000 {Sunny 50000000 200 [Finance Design Program Sales] false}}
    	*/
    }

    viper也提供了读取Command Line参数的功能:

    package main
    
    import (
    	"github.com/spf13/pflag"
    	"github.com/spf13/viper"
    	"fmt"
    )
    
    func main() {
    	pflag.String("hostAddress", "127.0.0.1", "Server running address")
    	pflag.Int64("port", 8080, "Server running port")
    	pflag.Parse()
    
    	viper.BindPFlags(pflag.CommandLine)
    	fmt.Printf("hostAddress :%s , port:%s", viper.GetString("hostAddress"), viper.GetString("port"))
    	/*
    	example:
    	go run main2.go --hostAddress=192.192.1.10 --port=9000
    	help:
    	Usage of /tmp/go-build183981952/b001/exe/main:
         --hostAddress string   Server running address (default "127.0.0.1")
         --port int             Server running port (default 8080)
    
    	*/
    
    }

    很多时候,我们服务器启动之后,如果临时想修改某些配置参数,需要重启服务器才能生效,但是viper提供了监听函数,可以免重启修改配置参数,非常的实用:

    package main
    
    import (
    	"github.com/spf13/viper"
    	"fmt"
    	"golang.org/x/net/context"
    	"github.com/fsnotify/fsnotify"
    )
    
    func main() {
    	//读取yaml文件
    	v := viper.New()
    	//设置读取的配置文件
    	v.SetConfigName("linux_config")
    	//添加读取的配置文件路径
    	v.AddConfigPath("./config/")
    	//windows环境下为%GOPATH,linux环境下为$GOPATH
    	v.AddConfigPath("$GOPATH/src/")
    	//设置配置文件类型
    	v.SetConfigType("yaml")
    
    	if err := v.ReadInConfig(); err != nil {
    		fmt.Printf("err:%s\n", err)
    	}
    
    	//创建一个信道等待关闭(模拟服务器环境)
    	ctx, _ := context.WithCancel(context.Background())
    	//cancel可以关闭信道
    	//ctx, cancel := context.WithCancel(context.Background())
    	//设置监听回调函数
    	v.OnConfigChange(func(e fsnotify.Event) {
    		fmt.Printf("config is change :%s \n", e.String())
    		//cancel()
    	})
    	//开始监听
    	v.WatchConfig()
    	//信道不会主动关闭,可以主动调用cancel关闭
    	<-ctx.Done()
    
    	/*
    	result:
    	config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE 
    	config is change :"/home/share/go/Viper/config/linux_config.yaml": CREATE
    	*/
    }

    完结

    viper还有许多好用的功能,此文章只是举例说明了很小的部分,欢迎留言,多提提意见,感谢大家。

    更多golang相关技术文章,请访问golang教程栏目!

    以上就是分享Golang中一个好用的viper配置模块的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:Golang
    上一篇:聊聊Go的并发编程 (二) 下一篇:使用Go defer时要注意这两处!
    第16期线上培训班

    相关文章推荐

    • 关于Golang Slice的append扩容• 聊聊分析golang的逃逸• 解析golang iris怎么使用• golang的极简流式编程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网