欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何使用Go的Viper來解析配置信息

 更新時間:2024年01月30日 09:33:27   作者:鼠鼠我捏,要死了捏  
Viper庫為Golang語言開發(fā)者提供了對不同數(shù)據(jù)源和不同格式的配置文件的讀取,是Go項目讀取配置的神器,我們今天就來講講如何使用Viper來解析配置信息,文中通過代碼示例講解非常詳細(xì),需要的朋友可以參考下

前言

對于現(xiàn)代應(yīng)用程序,尤其大中型的項目來說,在程序啟動和運行時,往往需要傳入許多參數(shù)來控制程序的行為,我們可以通過命令行參數(shù),環(huán)境變量,配置文件等方式來將參數(shù)傳遞給程序。而Viper庫為Golang語言開發(fā)者提供了對不同數(shù)據(jù)源和不同格式的配置文件的讀取,是Go項目讀取配置的神器,我們今天就來講講如何使用Viper來解析配置信息。

Viper簡介

Viper是適用于Go應(yīng)用程序(包括Twelve-Factor App)的完整配置解決方案。它被設(shè)計用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式。它支持以下特性:

  • 設(shè)置默認(rèn)值
  • 從JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件讀取配置信息
  • 實時監(jiān)控和重新讀取配置文件(可選)
  • 從環(huán)境變量中讀取
  • 從遠(yuǎn)程配置系統(tǒng)(etcd或Consul)讀取并監(jiān)控配置變化
  • 從命令行參數(shù)讀取配置
  • 從buffer讀取配置
  • 顯式配置值

快速上手

庫的安裝

viper的安裝非常簡單,如同其他Go第三方包一樣,只需要go get命令即可安裝

go get github.com/spf13/viper

導(dǎo)入

import "github.com/spf13/viper"

讀取配置文件單個屬性

viper.SetConfigFile("./config.yaml")
viper.ReadInConfig()
fmt.Println(viper.Get("我是不區(qū)分大小寫的key"))

序列化為對象

// 首先聲明一個配置映射對象
type DB struct {
	host string
	port string
}
 
func main() {
 
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath(".")
	viper.ReadInConfig() // 讀取配置
	var mysql DB
 
	viper.Unmarshal(&mysql) 將讀取到的配置序列化為對象
 
	fmt.Println(mysql.host)
	fmt.Println(mysql.port)
}

以上就是viper的簡單使用,可以看出使用起來還是很方便簡潔的。

更多語法

寫回配置文件

此外,viper還支持將配置值寫入配置文件,viper提供了四個函數(shù)將配置寫回文件。

WriteConfig

WriteConfig函數(shù)會將配置寫入預(yù)先設(shè)置好路徑的配置文件中,如果配置文件存在,則覆蓋,如果沒有,則創(chuàng)建。

SafeWriteConfig

SafeWriterConfig與WriteConfig函數(shù)唯一的不同是如果配置文件存在,則會返回一個錯誤。

WriteConfigAs

WriteConfigAs與WriteConfig函數(shù)的不同是需要傳入配置文件保存路徑,viper會根據(jù)文件后綴判斷寫入格式。

SafeWriteConfigAs

SafeWriteConfigAs與WriteConfigAs的唯一不同是如果配置文件存在,則返回一個錯誤。

監(jiān)聽配置文件

viper支持監(jiān)聽配置文件,并會在配置文件發(fā)生變化,重新讀取配置文件和回調(diào)函數(shù),這樣可以避免每次配置變化時,都需要重啟啟動應(yīng)用的麻煩。

// 設(shè)置監(jiān)聽回調(diào)
viper.OnConfigChange(func(e fsnotify.Event) {
	fmt.Println("檢測到配置文件已更改:", e.Name)
})
 
// 開啟監(jiān)聽
viper.WatchConfig()

注冊和使用別名

為某個配置key設(shè)置別名,這樣可以方便我們在不改變key的情況下,使用別的名稱訪問該配置。

viper.Set("name", "張三")
 
//為name設(shè)置一個username的別名
viper.RegisterAlias("username", "name")
 
//通過username可以讀取到name的值
fmt.Println(viper.Get("username"))
 
//修改name的配置值,username的值也發(fā)生改變
viper.Set("name", "李四")
 
// 輸出結(jié)果為李四
fmt.Println(viper.Get("username"))
 

讀取環(huán)境變量

對于讀取操作系統(tǒng)環(huán)境變量,viper提供了下面五個函數(shù):

  • AutomaticEnv()
  • BindEnv(string...) : error
  • SetEnvPrefix(string)
  • SetEnvKeyReplacer(string...) *strings.Replacer
  • AllowEmptyEnv(bool)

viper讀取環(huán)境變量,主要有兩種方式:

1.開啟AutomaticEnv函數(shù),可直接讀取環(huán)境變量

// 讀取不到
fmt.Println(viper.Get("path"))
 
//開始讀取環(huán)境變量
viper.AutomaticEnv()
 
//會從環(huán)境變量讀取到該值
fmt.Println(viper.Get("path"))

2.使用BindEnv綁定某個環(huán)境變量

//將p綁定到環(huán)境變量PATH,注意這里第二個參數(shù)是環(huán)境變量
viper.BindEnv("p", "PATH")
 
// 通過p讀取PATH的值
fmt.Println(viper.Get("p"))

封裝使用

1.安裝庫

go get github.com/spf13/viper

2.編寫配置文件,yaml為例

新建config.yaml配置文件,內(nèi)容如下

app: # 應(yīng)用基本配置
  env: local # 環(huán)境名稱
  port: 8080 # 服務(wù)監(jiān)聽端口號
  app_name: online-practice-system # 應(yīng)用名稱
  app_url: http://localhost # 應(yīng)用域名

3.定義配置映射的結(jié)構(gòu)體

這里因為配置有多層,所以我們結(jié)構(gòu)體也要對應(yīng)多層,我們可以再標(biāo)簽中通過設(shè)置mapstructure屬性來設(shè)置配置的屬性名

// Configuration為管理全部配置的父結(jié)點
type Configuration struct {
	App      App      `mapstructure:"app" yaml:"app"`
}
// 如果是多層配置,就需要定義多層結(jié)構(gòu)體
type App struct {
    // 在tag標(biāo)簽中加入yaml:"env"`,聲明配置對應(yīng)關(guān)系
    Env     string `mapstructure:"env" yaml:"env"`
    Port    string `mapstructure:"port" yaml:"port"`
    AppName string `mapstructure:"app_name" yaml:"app_name"`
    AppUrl  string `mapstructure:"app_url" yaml:"app_url"`
}

4.編寫配置讀取初始化函數(shù)

這里我們定義了初始化函數(shù),將配置讀取到自己global包下的App.Config全局變量,這里可以自己選擇讀取那哪

package bootstrap
import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"online-practice-system/global"
	"os"
)
// viper讀取配置文件初始化
func InitializeConfig() *viper.Viper {
	// 設(shè)置配置文件路徑
	config := "config.yaml"
	// 生產(chǎn)環(huán)境可以通過設(shè)置環(huán)境變量來改變配置文件路徑
	if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" {
		config = configEnv
	}
	// 初始化 viper
	v := viper.New()
	v.SetConfigFile(config)
	v.SetConfigType("yaml")
	if err := v.ReadInConfig(); err != nil {
		panic(fmt.Errorf("read config failed: %s \n", err))
	}
	// 監(jiān)聽配置文件
	v.WatchConfig()
	v.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("config fileDriver changed:", in.Name)
		// 重載配置,這里可以進行重啟服務(wù)器,或者其他操作
		if err := v.Unmarshal(&global.App.Config); err != nil {
			fmt.Println(err)
		}
	})
	// 將配置賦值給全局變量
	if err := v.Unmarshal(&global.App.Config); err != nil {
		fmt.Println(err)
	}
	return v
}

5.主程序啟動前調(diào)用初始化函數(shù)

func main() {
    //  初始化yaml配置文件
    InitializeConfig()
    ///
}

總結(jié)

Viper是一個功能強大且易于使用的配置讀取庫,它可以幫助我們簡化配置的讀取和管理過程,提高應(yīng)用程序的靈活性和可維護性。無論是小型項目還是大型應(yīng)用程序,Viper都是一個值得推薦的配置讀取解決方案。

以上就是詳解如何使用Go的Viper來解析配置信息的詳細(xì)內(nèi)容,更多關(guān)于Go Viper解析配置信息的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談JWT在GO中的使用方法及原理

    淺談JWT在GO中的使用方法及原理

    JWT是一種基于?JSON?的開放標(biāo)準(zhǔn),用于在網(wǎng)絡(luò)應(yīng)用間傳遞聲明,JWT被設(shè)計為可安全地將用戶身份驗證和授權(quán)數(shù)據(jù)作為?JSON?對象在各個應(yīng)用程序之間傳遞,本文將詳細(xì)給大家介紹JWT原理及在Go中的用法,需要的朋友可以參考下
    2023-05-05
  • golang去除多余的空格與換行符示例代碼

    golang去除多余的空格與換行符示例代碼

    Golang是一種強大的編程語言,提供了豐富的字符串處理功能,這篇文章主要給大家介紹了關(guān)于golang去除多余的空格與換行符的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 利用rpm打包上線部署golang代碼的方法教程

    利用rpm打包上線部署golang代碼的方法教程

    RPM是RPM Package Manager(RPM軟件包管理器)的縮寫,這篇文章主要給大家介紹了關(guān)于利用rpm打包上線部署golang代碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • go slice 擴容實現(xiàn)原理源碼解析

    go slice 擴容實現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • golang復(fù)制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    golang復(fù)制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    這篇文章主要為大家介紹了golang復(fù)制文件夾并移動到另一個文件夾實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 如何使用golang實現(xiàn)traceroute

    如何使用golang實現(xiàn)traceroute

    這篇文章主要介紹了如何使用golang實現(xiàn)traceroute,該工具在linux環(huán)境下的命令是traceroute或者tracepath,在windows下命令是tracert,本文給大家詳細(xì)講解需要的朋友可以參考下
    2023-04-04
  • golang語言http協(xié)議get拼接參數(shù)操作

    golang語言http協(xié)議get拼接參數(shù)操作

    這篇文章主要介紹了golang語言http協(xié)議get拼接參數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 深入了解Golang中的數(shù)據(jù)類型

    深入了解Golang中的數(shù)據(jù)類型

    在計算機編程中,數(shù)據(jù)類型是非常重要的一個概念。這篇文章將詳細(xì)介紹 Golang中的數(shù)據(jù)類型,包括基本類型、復(fù)合類型、引用類型以及自定義類型,希望對大家有所幫助
    2023-04-04
  • 淺析Go中序列化與反序列化的基本使用

    淺析Go中序列化與反序列化的基本使用

    序列化是指將對象轉(zhuǎn)換成字節(jié)流,從而存儲對象或?qū)ο髠鬏數(shù)絻?nèi)存、數(shù)據(jù)庫或文件的過程,反向過程稱為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下
    2023-04-04
  • golang并發(fā)之使用sync.Pool優(yōu)化性能

    golang并發(fā)之使用sync.Pool優(yōu)化性能

    在Go提供如何實現(xiàn)對象的緩存池功能,常用一種實現(xiàn)方式是sync.Pool,?其旨在緩存已分配但未使用的項目以供以后重用,從而減輕垃圾收集器(GC)的壓力,下面我們就來看看具體操作吧
    2023-10-10

最新評論