1. 程式人生 > >go配置檔案讀取

go配置檔案讀取

一個強大簡單好用的配置解決方案,Viper

Viper具有以下特性:

  • 設定預設值
  • 可以讀取如下格式的配置檔案:JSON、TOML、YAML、HCL
  • 監控配置檔案改動,並熱載入配置檔案
  • 從環境變數讀取配置
  • 從遠端配置中心讀取配置(etcd/consul),並監控變動
  • 從命令列 flag 讀取配置
  • 從快取中讀取配置
  • 支援直接設定配置項的值

Viper的讀取順序:

  • viper.Set() 所設定的值
  • 命令列 flag
  • 環境變數
  • 配置檔案
  • 配置中心:etcd/consul
  • 預設值

Viper在初始化之後,只需要呼叫viper.GetString()viper.GetInt()viper.GetBool()

等函式即可得到配置檔案中對應的引數。

Viper 也可以非常方便地讀取多個層級的配置,比如這樣一個 YAML 格式的配置:

common:
    db:
        name: db
        addr: 127.0.0.1:3306
        username: root
        password: root

如果要讀取name,只需要執行viper.GetString("common.db.name")就可以

下面來一個簡單的例子介紹Viper:
config/config.go

package config

import (
	"strings"
	"github.com/fsnotify/fsnotify"
"github.com/spf13/viper" ) type Config struct { Name string } func Init(cfg string) error { c := Config{ Name: cfg, } // 初始化配置檔案 if err := c.initConfig(); err != nil { return err } c.watchConfig() return nil } func (c *Config) initConfig() error { if c.Name != "" { // 如果指定了配置檔案,則解析指定的配置檔案
viper.SetConfigFile(c.Name) } else { // 如果沒有指定配置檔案,則解析預設的配置檔案 viper.AddConfigPath("conf") viper.SetConfigName("config") } // 設定配置檔案格式為YAML viper.SetConfigType("yaml") // viper解析配置檔案 if err := viper.ReadInConfig(); err != nil { return err } return nil } // 監聽配置檔案是否改變,用於熱更新 func (c *Config) watchConfig() { viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { fmt.Printf("Config file changed: %s\n", e.Name) }) }

conf/config.yaml

name: demo
common:
    db:
        name: db
        addr: 127.0.0.1:3306
        username: root
        password: root

main.go

package main

import (
	"test/config"
  "fmt"
	"github.com/spf13/viper"
)

func main() {

	if err := config.Init(""); err != nil {
		panic(err)
	}

	name := viper.GetString("name")

	fmt.Println("Viper get name:",name)
}

執行go run main.go
Viper get name: demo

微信搜尋「goentry-xyz」,關注公眾號「燈下獨碼」