最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

快速上手

庫的安裝

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

go get github.com/spf13/viper

導入

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ù)會將配置寫入預先設(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)多層,我們可以再標簽中通過設(shè)置mapstructure屬性來設(shè)置配置的屬性名

// Configuration為管理全部配置的父結(jié)點
type Configuration struct {
	App      App      `mapstructure:"app" yaml:"app"`
}
// 如果是多層配置,就需要定義多層結(jié)構(gòu)體
type App struct {
    // 在tag標簽中加入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來解析配置信息的詳細內(nèi)容,更多關(guān)于Go Viper解析配置信息的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang sql語句超時控制方案及原理

    golang sql語句超時控制方案及原理

    一般應(yīng)用程序在執(zhí)行一條sql語句時,都會給這條sql設(shè)置一個超時時間,本文主要介紹了golang sql語句超時控制方案及原理,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解

    Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解

    這篇文章主要為大家介紹了Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • golang 切片截取參數(shù)方法詳解

    golang 切片截取參數(shù)方法詳解

    這篇文章主要介紹了golang 切片截取參數(shù)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • golang并發(fā)下載多個文件的方法

    golang并發(fā)下載多個文件的方法

    今天小編就為大家分享一篇golang并發(fā)下載多個文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Go使用path/filepath包處理文件路徑的完全指南

    Go使用path/filepath包處理文件路徑的完全指南

    本文詳細介紹了Go語言中path/filepath包的使用,涵蓋了路徑處理、拼接、規(guī)范化、遍歷和匹配等功能,適用于文件系統(tǒng)操作的各種場景,需要的朋友可以參考下
    2026-03-03
  • go-zero過載保護源碼解讀

    go-zero過載保護源碼解讀

    這篇文章主要為大家介紹了go-zero過載保護源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Go語言map字典用法實例分析

    Go語言map字典用法實例分析

    這篇文章主要介紹了Go語言map字典用法,實例分析了map字典的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言利用接口實現(xiàn)鏈表插入功能詳解

    Go語言利用接口實現(xiàn)鏈表插入功能詳解

    這篇文章主要為大家介紹了Go語言中的接口,以及如何利用接口實現(xiàn)鏈表插入功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-04-04
  • Golang基于文件魔數(shù)判斷文件類型的案例代碼

    Golang基于文件魔數(shù)判斷文件類型的案例代碼

    這篇文章主要介紹了Golang基于文件魔數(shù)判斷文件類型,本文介紹了基于文件魔數(shù)判斷文件類型的方法,主要涉及如何ReadSeek讀取文件指定字節(jié)內(nèi)容,然后介紹文件魔數(shù),最后給出示例基于魔數(shù)判斷文件類型,需要的朋友可以參考下
    2023-02-02
  • Go語言高效編程的3個技巧總結(jié)

    Go語言高效編程的3個技巧總結(jié)

    Go語言是一種開源編程語言,可輕松構(gòu)建簡單、可靠且高效的軟件,下面這篇文章主要給大家分享介紹了關(guān)于Go語言高效編程的3個技巧,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論

射洪县| 土默特右旗| 滨州市| 绿春县| 德安县| 双鸭山市| 通河县| 云龙县| 南通市| 南华县| 突泉县| 东安县| 清水县| 宜春市| 潼南县| 武山县| 滨海县| 余姚市| 永嘉县| 康平县| 本溪市| 万全县| 中西区| 襄汾县| 陈巴尔虎旗| 南丹县| 长武县| 扶沟县| 亳州市| 新乡县| 青冈县| 游戏| 马关县| 黄山市| 永昌县| 舒城县| 武山县| 青州市| 宜宾市| 宿迁市| 鹰潭市|