golang中的viper示例

Posted aguncn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang中的viper示例相关的知识,希望对你有一定的参考价值。

这是第二次实操viper了,

年纪大了就多练练,才能记住。

 http://go.coder55.com/article/6589

https://github.com/spf13/viper

 

package main

import (
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
	"golang.org/x/net/context"
	"github.com/fsnotify/fsnotify"
	"fmt"
)

func main() {
	//读取Command Line参数
	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"),
	)	
		
	//读取yaml文件
	v := viper.New()
	v.SetConfigName("linux_config")
	v.AddConfigPath("./")
	v.SetConfigType("yaml")
	
	if err := v.ReadInConfig(); err != nil {
		fmt.Printf("err: %s
", err)
	}
	
	fmt.Printf(`TimeStamp:%s 

		CompanyInfomation.Name:%s 

		CompanyInfomation.Department:%s 
`,
		v.Get("TimeStamp"),
		v.Get("CompanyInfomation.Name"),
		v.Get("CompanyInfomation.Department"),
	)
	
	//监听函数,可以免重启修改配置参数
	ctx, _ := context.WithCancel(context.Background())
	v.OnConfigChange(func(e fsnotify.Event) {
		fmt.Printf("config is change: %s
", e.String())
		
		fmt.Printf(`TimeStamp:%s 

		CompanyInfomation.Name:%s 

		CompanyInfomation.Department:%s 
`,
		v.Get("TimeStamp"),
		v.Get("CompanyInfomation.Name"),
		v.Get("CompanyInfomation.Department"),
	)
	})
	
	v.WatchConfig()
	<-ctx.Done()
	
	//反序列化
	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)
}

  

输出的样子

技术图片

 

package main
import (
	"flag"
	"github.com/spf13/pflag"
)
func main() {
 
	// using standard library "flag" package
	flag.Int("flagname", 1234, "help message for flagname")
 
	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
	pflag.Parse()
	viper.BindPFlags(pflag.CommandLine)
 
	i := viper.GetInt("flagname") // retrieve value from viper
 
	...
}

  

在Viper中使用pflag并不排除使用 标准库中使用标志包的其他包。pflag包可以通过导入这些标志来处理为标志包定义的标志。这是通过调用名为AddGoFlagSet()的pflag包提供的便利函数来实现的。

以上是关于golang中的viper示例的主要内容,如果未能解决你的问题,请参考以下文章

golang 配置文件解析神器--viper

Golang的viper库

golang viper & hcl 配置文件问题

golang viper_config

使用viper 进行golang 应用的配置管理

golang的配置文件操作:viper