ホームページ  >  記事  >  バックエンド開発  >  Golang で便利な Viper 構成モジュールを共有する

Golang で便利な Viper 構成モジュールを共有する

藏色散人
藏色散人転載
2021-07-09 14:58:192574ブラウズ

はじめに

viper は Yaml、Json、TOML、HCL などの形式をサポートしており、非常に読みやすいです。

#インストール

github.com/spf13/viper# を取得してください## プロンプトで golang.org/x/text/ ライブラリが見つからない場合は、GitHub でホストされている golang.org/x/text/ ライブラリのパスが矛盾していることが原因です。

解決策: https://github.com/golang/text からソース コードをダウンロードし、$ に移動します。 GOPATH/src 次に、 golang.org/x/ フォルダーを作成し (既存のものは無視します)、圧縮パッケージ ファイルを golang.org/x/ フォルダーに解凍します。

次に、 go install -x golang.org/x/text を実行して解決します。

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 はコマンド ライン パラメーターを読み取る機能も提供します:

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 が提供する listen 機能により、再起動せずに構成パラメータを変更できます。これは非常に実用的です:

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
	*/
}

End

viper には便利な機能もたくさんあります。この記事では、その多くを例を挙げて説明するだけです。ほんの一部です。メッセージを残して、さらに多くのコメントを提供してください。ありがとうございます。

golang 関連の技術記事をさらに詳しく知りたい場合は、

golang チュートリアル列をご覧ください。

以上がGolang で便利な Viper 構成モジュールを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。