Viper配置管理筆記

一、什么是 Viper?

Viper 是 Go 語言的一個強大工具,就像一個超級管家,專門負責幫你打理程序的各種配置。它能把配置文件(比如 JSON、YAML、TOML 等格式)里的內容讀出來,還能監控配置文件的變化,甚至可以從環境變量、命令行參數、遠程配置服務器(比如 etcd、Consul)里拿配置。總之,有了 Viper,配置管理就變得簡單又靈活。

二、為什么用 Viper?

  1. 支持多種格式:無論是 YAML、JSON 還是其他格式的配置文件,Viper 都能輕松讀取。

  2. 提供默認值:如果配置文件里沒寫某些值,Viper 可以用默認值頂上,避免程序出錯。

  3. 實時監控:配置文件改了,Viper 能立刻發現并更新,不用重啟程序。

  4. 靈活優先級:Viper 有一套明確的規則,決定哪個配置來源更重要,避免沖突。

三、Viper 的生活化例子

假設你開了一家餐廳,Viper 就像你的大堂經理:

  • 支持多種菜單格式:無論是紙質菜單、電子菜單還是黑板菜單,大堂經理都能讀懂。

  • 提供默認菜品:如果客人沒點菜,大堂經理會根據默認菜單給客人上菜。

  • 實時監控菜單變化:如果廚房臨時換了菜品,大堂經理會立刻通知所有客人。

  • 靈活優先級:如果客人點的菜和默認菜單沖突,以客人點的菜為準;如果廚房缺貨,再考慮其他替代方案。

四、Viper 的代碼示例

示例 1:讀取 YAML 配置文件

package mainimport ("fmt""github.com/spf13/viper"
)func main() {// 設置配置文件信息viper.SetConfigName("config")  // 配置文件名(無擴展名)viper.SetConfigType("yaml")    // 配置文件類型viper.AddConfigPath(".")       // 添加配置文件路徑// 讀取配置文件if err := viper.ReadInConfig(); err != nil {panic(fmt.Errorf("讀取配置文件出錯: %s", err))}// 獲取配置值port := viper.GetInt("port")version := viper.GetString("version")mysqlHost := viper.GetString("mysql.host")mysqlPort := viper.GetInt("mysql.port")mysqlDbname := viper.GetString("mysql.dbname")// 打印配置值fmt.Printf("服務器端口: %d\n", port)fmt.Printf("版本號: %s\n", version)fmt.Printf("MySQL 地址: %s:%d\n", mysqlHost, mysqlPort)fmt.Printf("MySQL 數據庫名: %s\n", mysqlDbname)
}

示例 2:實時監控配置文件變化

package mainimport ("fmt""github.com/fsnotify/fsnotify""github.com/spf13/viper""time"
)func main() {// 設置配置文件信息viper.SetConfigName("config")viper.SetConfigType("yaml")viper.AddConfigPath(".")// 讀取配置文件if err := viper.ReadInConfig(); err != nil {panic(fmt.Errorf("讀取配置文件出錯: %s", err))}// 監控配置文件變化viper.WatchConfig()viper.OnConfigChange(func(e fsnotify.Event) {fmt.Println("配置文件有變化:", e.Name)// 這里可以添加配置更新后的邏輯})// 模擬程序運行for {time.Sleep(1 * time.Second)fmt.Println("當前版本:", viper.GetString("version"))}
}

五、總結

Viper 是一個功能強大、靈活易用的配置管理工具,它就像是程序配置的超級管家,為開發者提供了全方位的配置解決方案。無論是簡單的命令行工具,還是復雜的分布式系統,Viper 都能輕松應對,幫助開發者高效、穩定地管理配置信息,讓程序在不同的環境和場景下都能穩定運行,極大地提升了開發效率和程序的質量,是 Go 語言開發中不可或缺的得力助手。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76544.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現對象之間的序列化和反序列化

1.什么是序列化? 在項目的開發中,為了讓前端更好的分析后端返回的結果,我們一般會將返回的信息進行序列化,序列化就是將返回對象的狀態信息轉換為一種標準化的格式,方便在網絡中傳輸也方便打印日志時號觀察&#xff0…

ThreadLocal - 原理與應用場景詳解

ThreadLocal 的基礎概念 在 Java 的多線程世界里,線程之間的數據共享與隔離一直是一個關鍵話題。如果處理不當,很容易引發線程安全問題,比如數據混亂、臟讀等。而 ThreadLocal 這個工具類,就像是為線程量身定制的 “私人儲物柜”…

iwebsec靶場 文件包含關卡通關筆記11-ssh日志文件包含

目錄 日志包含 1.構造惡意ssh登錄命令 2.配置ssh日志開啟 (1)配置sshd (2)配置rsyslog (3)重啟服務 3.寫入webshell木馬 4.獲取php信息滲透 5.蟻劍連接 日志包含 1.構造惡意ssh登錄命令 ssh服務…

Diamond軟件的使用--(4)搭建Modelsim仿真庫

使用Modelsim仿真的原因 由于diamond自帶的仿真軟件Active-HDL需要另一套Lisence,所以我們使用第三方仿真軟件Modelsim來進行仿真。 Modelsim10.5下載鏈接如下:https://pan.baidu.com/s/1G9699ocWm1UTqK2yS2igyQ 提取碼:lewa 一、Lattice仿…

2025年4月19日,四月第三周,C++,字符串數組答案解析

答案與解析 1. 輸出字符串數組所有元素 cpp 復制 下載 #include <iostream> using namespace std;int main() {string arr[] = {"apple", "banana", "cherry"};int n = sizeof(arr)/sizeof(arr[0]); // 計算數組長度for (int i = 0; …

C語言之高校學生信息快速查詢系統的實現

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 總有人間一兩風&#xff0c;填我十萬八千夢。 &#x1f680; 路漫漫其修遠兮&#xff0c;吾將上下而求索。 C語言之高校學生信息快速查詢系統的實現 目錄 任務陳述與分析 問題陳述問題分析 數據結構設…

【網絡篇】TCP vs UDP底層區別+網絡編程概念

大家好呀 我是浪前 今天講解的是網絡篇的第三章&#xff1a;網絡編程概念和TCP&UDP的區別 網絡編程概念TCP和UDP的區別 跨主機通信:網絡編程插座&#xff1a;網絡編程的本質&#xff1a; 網絡編程的重要概念&#xff1a;客戶端和服務器&#xff1a; 客戶端和服務器的交互模…

EMIF詳解

一、EMIF的基本定義 EMIF&#xff08;External Memory Interface&#xff0c;外部存儲器接口&#xff09; 是嵌入式處理器&#xff08;如DSP、FPGA、SoC&#xff09;用于連接外部存儲器的專用硬件接口模塊&#xff0c;負責管理處理器與存儲器之間的地址/數據總線、控制信號及時…

Keil MDK 編譯問題:function “HAL_IncTick“ declared implicitly

問題與處理策略 問題描述 ..\..\User\stm32f1xx_it.c(141): warning: #223-D: function "HAL_IncTick" declared implicitlyHAL_IncTick(); ..\..\User\stm32f1xx_it.c: 1 warning, 0 errors問題原因 在 stm32f1xx_it.c 文件中調用了 HAL_IncTick()&#xff0c;但…

Java Web項目(一)

框架 java web項目總工分為兩部分&#xff1a;客戶端&#xff08;前端&#xff09;和服務端&#xff08;后端&#xff09; 客戶端發起請求&#xff0c;服務端接受請求并進行處理 發起請求的方式&#xff1a;from表單、jQuery ajax from表單 造成全局的變化&#xff0c;在發…

Dify部署內網時遇到的代理問題及解決辦法

大家知道&#xff0c;在公網環境下利用docker安裝dify源碼鏡像比較容易&#xff0c;詳見我之前的文章&#xff0c;基于dify開發agent、workflow等非常方便&#xff0c;本次想著在內部網絡環境下也完成部署&#xff0c;以方便更多的人使用&#xff0c;但在部署到內網環境下&…

多節點監控的docker管理面板Portainer安裝指南:家庭云計算專家

背景 Portainer 是一個輕量級且功能強大的容器管理面板&#xff0c;專為 Docker 和 Kubernetes 環境設計。它通過直觀的 Web 界面簡化了容器的部署、管理和監控&#xff0c;即使是非技術用戶也能輕松上手。Portainer 支持多節點管理&#xff0c;允許用戶從一個中央控制臺管理多…

Linux內核哈希表學習筆記

前沿 近期項目中需要給自定義的驅動增加一個功能存儲相關的數據信息。結合實際業務層面,最終決定采用哈希表的結構來存儲。因為其具備快速查找,插入和刪除。其實現原理通過散列函數映射到指定位置。時間復雜度O(1).而且運算速度也快,很適合處理大量的數據場景。但是其也有一…

對于在線教育或知識付費類網站視頻處理方案

一、視頻格式&#xff1a; 1. 推薦格式&#xff1a;HLS&#xff08;HTTP Live Streaming&#xff09; 優勢?&#xff1a; ?自適應碼率?&#xff1a;根據用戶網絡狀況自動切換清晰度&#xff0c;避免卡頓。?廣泛兼容性?&#xff1a;iOS/macOS 原生支持&#xff0c;Android…

Deepseek輸出的內容如何直接轉化為word文件?

我們有時候會直接利用deepseek翻譯別人的文章或者想將deepseek輸出的內容直接復制到word文檔里。但是文本格式和word是不對應的。這時候需要輸入如下命令&#xff1a; 以上翻譯內容的格式和排版要求如下&#xff1a; 1、一級標題 字體為黑體&#xff08;三號&#xff09;&…

【Vue】組件通信(Props/Emit、EventBus、Provide/Inject)

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Props/Emit 父子組件通信1.1 Props 向下傳遞數據1.2 Emit 向上傳遞事件 2. EventBus 跨組件通信2.1 創建事件總線2.2 使用事件總線2.3 EventBus 優缺點 3. Provide/Inject 深層組件通信3.1 基本使用3.2 響應式處…

vulnhub sunset系列靶機合集(部分)

描述&#xff1a;該合集包含sunset系列適合新手的四個靶機&#xff08;sunset:1、dusk、sunrise、noontide&#xff09;的滲透全過程。 靶機下載地址&#xff1a;Vulnerable By Design - Search: sunset ~ VulnHubhttps://www.vulnhub.com/?qsunset sunset:1 滲透過程 信息…

【MySQL】MySQL的基礎語法及其語句的介紹

1、基礎語法 mysql -h【主機名】 -u【用戶名】 -p //登錄MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有數據庫 use 【數據庫名】; //進入數據庫 show tables; //查看數據庫下的所有表名 *MySQL的啟動和關閉 &am…

2025-4-20-C++ 學習 數組(1)

數組 2025-4-20-C++ 學習 數組(1)P1428 小魚比可愛題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1說明/提示題解代碼P1427 小魚的數字游戲題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1說明/提示數據規模與約定題解代碼P5727 【深基5.例3】冰雹猜想題目描…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之LCD)

目錄 ESP-ADF外設子系統深度解析&#xff1a;esp_peripherals組件架構與核心設計&#xff08;顯示輸出類外設之LCD&#xff09;簡介模塊概述功能定義架構位置核心特性 LCD外設分析LCD外設概述LCD外設層次架構圖 LCD外設API和數據結構外設層API公共API內部數據結構 LCD外設配置選…