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

詳解Golang如何動態(tài)獲取配置文件

 更新時間:2023年08月29日 10:42:59   作者:wmm369  
項目中經(jīng)常獲取一些常用配置文件,當(dāng)有配置文件中的參數(shù)被修改后,如何的實時獲取配置文件就很關(guān)鍵了,下面小編就來講講如何利用viper實時獲取配置文件吧

項目中經(jīng)常獲取一些常用配置文件,當(dāng)有配置文件中的參數(shù)被修改后,如何的實時獲取配置文件就很關(guān)鍵了。這里推薦"viper"這個包,用來實時獲取配置文件。

1.VIPER簡介

viper【蝰蛇】

Viper是適用于Go應(yīng)用程序的完整配置解決方案。它旨在在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式。它支持:

  • 設(shè)置默認值
  • 從JSON,TOML,YAML,HCL,envfile和Java屬性配置文件中讀取
  • 實時觀看和重新讀取配置文件(可選)
  • 從環(huán)境變量中讀取
  • 從遠程配置系統(tǒng)(etcd或Consul)中讀取,并觀察更改
  • 從命令行標(biāo)志讀取
  • 從緩沖區(qū)讀取
  • 設(shè)置顯式值

可以將Viper視為滿足您所有應(yīng)用程序配置需求的注冊表。

2.使用說明

本文中的實例都是從viper的官方介紹中復(fù)制過來,只是介紹了簡單的使用。完整的實例請查看【https://pkg.go.dev/github.com...

2.1建立默認值

viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

2.2讀取配置文件

viper.SetConfigName("config") // name of config file (without extension)
viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name
viper.AddConfigPath("/etc/appname/")   // path to look for the config file in
viper.AddConfigPath("$HOME/.appname")  // call multiple times to add many search paths
viper.AddConfigPath(".")               // optionally look for config in the working directory
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
    panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

2.3 讀取和重新讀取配置文件

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("Config file changed:", e.Name)
})

2.4 獲取值

在Viper中,根據(jù)值的類型,有幾種獲取值的方法。存在以下功能和方法:

  • Get(key string) : interface{}
  • GetBool(key string) : bool
  • GetFloat64(key string) : float64
  • GetInt(key string) : int
  • GetIntSlice(key string) : []int
  • GetString(key string) : string
  • GetStringMap(key string) : map[string]interface{}
  • GetStringMapString(key string) : map[string]string
  • GetStringSlice(key string) : []string
  • GetTime(key string) : time.Time
  • GetDuration(key string) : time.Duration
  • IsSet(key string) : bool
  • AllSettings() : map[string]interface{}

3. 實例代碼

使用GIN框架,簡單配置一個可以通過接口獲取配置內(nèi)容的http服務(wù)。當(dāng)調(diào)用接口http://127.0.0.1:8080/getConfig可以獲取配置項

步驟1:設(shè)置配置文件

在工作目錄中創(chuàng)建config.yml文件,文件內(nèi)容如下:

Version: "2.1"
Debug: false
MongoDB:
  IP: 127.0.0.1
  Port: 27017
  DbName: "db_name"

步驟二:編寫服務(wù)代碼

package main
import (
    "fmt"
    "github.com/fsnotify/fsnotify"
    "github.com/gin-gonic/gin"
    "github.com/spf13/viper"
)
var config *viper.Viper
func main() {
    config = initConfigure()
    r := gin.Default()
    r.GET("/getConfig", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "config": config.AllSettings(),
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
func initConfigure() *viper.Viper {
    v := viper.New()
    v.SetConfigName("config") // 設(shè)置文件名稱(無后綴)
    v.SetConfigType("yaml")   // 設(shè)置后綴名 {"1.6以后的版本可以不設(shè)置該后綴"}
    v.AddConfigPath("./")  // 設(shè)置文件所在路徑
    v.Set("verbose", true) // 設(shè)置默認參數(shù)
    if err := v.ReadInConfig(); err != nil {
        if _, ok := err.(viper.ConfigFileNotFoundError); ok {
            panic(" Config file not found; ignore error if desired")
        } else {
            panic("Config file was found but another error was produced")
        }
    }
    // 監(jiān)控配置和重新獲取配置
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("Config file changed:", e.Name)
    })
    return v
}

步驟三:演示:

啟動服務(wù),通過postman調(diào)用http://127.0.0.1:8080/getConfig 可以獲得如下參數(shù):

這個時候把yml文件中的version修改成3.0。這個時候后臺會打印輸出一句

Config file changed: /Users/Keil/GoLang/src/tutorials/viper/config.yml

這是因為我在代碼中調(diào)用了兩個關(guān)鍵的函數(shù),WatchConfig和OnConfigChange。函數(shù)OnConfigChange打印輸出了這句,輸出代碼:
fmt.Println("Config file changed:", e.Name)

關(guān)于這兩個函數(shù)的源碼解析和工作原理,可以參考【go基于viper實現(xiàn)配置文件熱更新及其源碼分析】。里面介紹的比較詳細。這里只是介紹如何使用。

此時再次調(diào)用接口,配置信息會變成如下:

4.資料鏈接

Viper簡介

go基于viper實現(xiàn)配置文件熱更新及其源碼分析

到此這篇關(guān)于詳解Golang如何動態(tài)獲取配置文件的文章就介紹到這了,更多相關(guān)Go配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你深入了解Golang中的自旋鎖

    一文帶你深入了解Golang中的自旋鎖

    自旋鎖是一種忙等待鎖,當(dāng)一個線程嘗試獲取一個已經(jīng)被其它線程持有的鎖時,這個線程會持續(xù)循環(huán)檢查鎖的狀態(tài)(即“自旋”)?,直到鎖被釋放后獲得所有權(quán),下面我們就來深入了解下自旋鎖的具體操作吧
    2024-01-01
  • Go語言如何使用分布式鎖解決并發(fā)問題

    Go語言如何使用分布式鎖解決并發(fā)問題

    這篇文章主要為大家詳細介紹了Go 語言生態(tài)中基于 Redis 實現(xiàn)的分布式鎖庫 redsync,并探討其使用方法和實現(xiàn)原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直從事java開發(fā),習(xí)慣了使用yaml文件的格式,尤其是清晰的層次結(jié)構(gòu)、注釋,下面這篇文章主要給大家介紹了關(guān)于Golang解析yaml文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 一文詳解Go語言中的有限狀態(tài)機FSM

    一文詳解Go語言中的有限狀態(tài)機FSM

    有限狀態(tài)機(Finite?State?Machine,F(xiàn)SM)是一種數(shù)學(xué)模型,用于描述系統(tǒng)在不同狀態(tài)下的行為和轉(zhuǎn)移條件。本文主要來和大家簡單講講Go語言中的有限狀態(tài)機FSM的使用,需要的可以參考一下
    2023-04-04
  • Go 1.13中errors包的新變化示例解析

    Go 1.13中errors包的新變化示例解析

    這篇文章主要為大家介紹了Go 1.13中errors包的新變化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Golang中實現(xiàn)JWT的高效工具包

    Golang中實現(xiàn)JWT的高效工具包

    本文主要介紹了Golang中實現(xiàn)JWT的高效工具包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解

    go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解

    這篇文章主要為大家介紹了go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Go語言reflect包的反射機制基本用法示例

    Go語言reflect包的反射機制基本用法示例

    反射在處理接口和類型斷言、開發(fā)通用功能或者設(shè)計框架時尤為重要,本文將深入探索 Go 語言中的反射機制,通過具體的示例展示如何使用?reflect?包,讓你能夠在 Go 項目中有效地利用這一強大的工具
    2023-11-11
  • golang有用的庫及工具 之 zap.Logger包的使用指南

    golang有用的庫及工具 之 zap.Logger包的使用指南

    這篇文章主要介紹了golang有用的庫及工具 之 zap.Logger包的使用指南,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

白沙| 西峡县| 贵港市| 湟中县| 阿拉善盟| 建宁县| 邻水| 白银市| 黄骅市| 绍兴县| 高密市| 宝丰县| 襄汾县| 平乡县| 天津市| 虹口区| 凤台县| 莆田市| 寿光市| 宝坻区| 汉中市| 安岳县| 资溪县| 龙游县| 西充县| 隆回县| 石城县| 林西县| 武穴市| 孝义市| 利川市| 兴海县| 伊金霍洛旗| 库尔勒市| 田东县| 平顶山市| 香河县| 明水县| 兰西县| 莱阳市| 上思县|