golang 使用 viper 加載配置文件 自動反序列化到結構

golang使用 viper 無需設置 mapstructure tag 根據配置文件后綴 自動返序列化到結構
解決結構有下劃線的字段解析不成功問題

viper 正常加載配置文件

golang viper 其中可以用來 查找、加載和反序列化JSON、TOML、YAML、HCL、INI、envfile和格式的配置文件

配置文件 test_toml.toml

http_addr = ":8082"
grpc_addr = ":8083"
jaeger_url= "http://localhost:14268/api/traces"
tracing= true

golang代碼

type ConfigTest struct {HttpAddr  string `json:"http_addr" toml:"http_addr" yaml:"http_addr"`GrpcAddr  string `json:"grpc_addr" toml:"grpc_addr" yaml:"grpc_addr"`JaegerUrl string `json:"jaeger_url" toml:"jaeger_url" yaml:"jaeger_url" mapstructure:"jaeger_url"`Tracing   bool   `toml:"tracing"  json:"tracing" yaml:"tracing" ` // opentelemetry tracing
}// jaeger 加載配置文件
func TestSourceFile_Unmarshal(t *testing.T) {filePath := "./test_toml.toml"viper.SetConfigFile(filePath)if err := viper.ReadInConfig(); err != nil {t.Error(err)}c := &ConfigTest{}if err := viper.Unmarshal(c); err != nil {t.Error(err)}logger.Infow("Unmarshal file sucess", "v", c)
}

打印返序列化的配置結構

{"level":"info","ts":"2023-08-27T21:35:27.041+0800","caller":"config/source_file_test.go:31","msg":"Unmarshal file sucess","v":{"http_addr":"","grpc_addr":"","jaeger_url":"http://localhost:14268/api/traces","tracing":true}}

可以看到帶下劃線的字段,不加 mapstructure 標簽,是不會反序列化

不加 mapstructure tag實現自動反序列化

查看viper Unmarshal 代碼

func (v *Viper) Unmarshal(rawVal interface{}, opts ...DecoderConfigOption) error {return decode(v.AllSettings(), defaultDecoderConfig(rawVal, opts...))
}
func decode(input interface{}, config *mapstructure.DecoderConfig) error {decoder, err := mapstructure.NewDecoder(config)if err != nil {return err}return decoder.Decode(input)
}
func NewDecoder(config *DecoderConfig) (*Decoder, error) {if config.TagName == "" {config.TagName = "mapstructure"}// ...
}
  • 從代碼看出 Viper使用的是 github.com/mitchellh/mapstructure來解析值
  • mapstructure 用于將通用的map[string]interface{}解碼到對應的 Go 結構體中
  • 默認情況下,mapstructure 使用結構體中字段的名稱做這個映射,不區分大小寫,比如 Name 字段可以映射到
    name、NAME、NaMe 等等
  • 如果沒有指定 tagName ,則默認為 mapstructure,這也是為什么帶下劃線的字段不加 mapstructure
    標簽無法解析的原因
  • viper 中Unmarshal的第二個參數是可以指定 DecoderConfigOption 的,從而可以指定 tagName

viper根據文類型件自動解碼到結構

讀取文件后綴比如 toml
根據后綴設置 tagName
調用 viper.Unmarshal解析

func TestSourceFile_Unmarshal1(t *testing.T) {filePath := "./test_toml.toml"c := &ConfigTest{}if err := viperUnmarshal(c, filePath); err != nil {t.Error(err)}logger.Infow("Unmarshal file sucess", "v", c)
}func viperUnmarshal(v interface{}, configPath string) error {var tagName stringext := filepath.Ext(configPath)if len(ext) > 1 {tagName = ext[1:]}// set decode tag_name, default is mapstructuredecoderConfigOption := func(c *mapstructure.DecoderConfig) {c.TagName = tagName}cViper := viper.New()cViper.SetConfigFile(configPath)if err := cViper.ReadInConfig(); err != nil {return err}return cViper.Unmarshal(v, decoderConfigOption)
}

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

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

相關文章

jdom利用純java技術對xml文檔進行解析、生成、序列化等各種操作

Jdom對xml文檔進行解析、生成、序列化等各種操作。 使用jdom之前,首先要導入jar包:jdom.jar 獲得根元素: //首先確定xml文件位置 String xmlPath "./src/ceshi/Test.xml"; //使用的解析器,這里表示默認的解…

KMP算法數組下標從0和數組下標從1開始

我在運用KMP時&#xff0c;總時會搞混如果數組下標為0時要如何用寫&#xff0c;下標為1時要如何寫。 當下標為0時kmp void kmp(int len) {//下標為0 時vector<int> f(n,-1);for(int i 1;i < len;i){ // 每次更新的是 下標i // 當第 i1不匹配是 跳到 f[i]的位置上&…

106.進程控制(結束、孤兒、僵尸進程)以及進程回收

目錄 結束進程 孤兒進程 僵尸進程 進程回收 wait() waitpid 進程控制是指在操作系統中對進程進行創建、終止、掛起、喚醒以及進程之間的同步、通信等操作的管理。 結束進程 exit() 和 _exit() 函數都用于終止一個進程&#xff0c;但它們之間有一些重要的區別&#xf…

新工科:數據科學與大數據技術實驗中心解決方案,賦能高校新工科數智人才培養

隨著數字經濟蓬勃發展&#xff0c;數字化產業和產業數字化成為就業增長新動能。據人瑞人才與德勤調研顯示&#xff0c;未來3年&#xff0c;數字產業化企業最需要運營人員和開發人員&#xff08;包括大數據開發工程師、數據建模開發工程師等&#xff09;&#xff0c;其次是數據分…

【RTOS學習】FreeRTOS中的鏈表 | 堆的管理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;專欄&#xff1a;《RTOS學習》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交給時間&#xff01; 目錄 &#x1f969;FreeRTOS中的鏈表&#x1f95e;初始化&#x1f95e;尾部插入&#x1f95e;按順…

OpenWRT搭建本地web站點并結合內網穿透實現公網遠程訪問

文章目錄 前言1. 檢查uhttpd安裝2. 部署web站點3. 安裝cpolar內網穿透4. 配置遠程訪問地址5. 配置固定遠程地址 前言 uhttpd 是 OpenWrt/LuCI 開發者從零開始編寫的 Web 服務器&#xff0c;目的是成為優秀穩定的、適合嵌入式設備的輕量級任務的 HTTP 服務器&#xff0c;并且和…

【Windows】MCSM面板搭建Mycraft服務器,實現公網遠程聯機

文章目錄 前言1.Mcsmanager安裝2.創建Minecraft服務器3.本地測試聯機4. 內網穿透4.1 安裝cpolar內網穿透4.2 創建隧道映射內網端口 5.遠程聯機測試6. 配置固定遠程聯機端口地址6.1 保留一個固定TCP地址6.2 配置固定TCP地址 7. 使用固定公網地址遠程聯機 前言 MCSManager是一個…

[香橙派]Orange pi zero 3命令行配網方法——建立ssh連接——Ubuntu配置WIFI自動連接

一、前言 前面我們給Orange Pi安裝了Ubuntu系統&#xff0c;并通過MobaXterm進行了串口連接&#xff0c;但其實并不方便&#xff0c;在日常開發中&#xff0c;我們希望能夠使用更方便的ssh連接來進行操作&#xff0c;因此配置網絡是必要的。 本章介紹的方法無需網線、HDMI線等&…

upload-labs

01 隨便上傳個文件 發現對于上傳類型有限制 查看頁面代碼發現是js的過濾直接關閉js 上傳成功 右鍵圖片在新建標簽頁打開文件 這里直接抓包改名字也行 02 抓包修改后綴名 03 發現后端做了檢測抓包修改失敗 大小寫繞過失敗&#xff0c;php特性php1等會被當成php執行 這里圖片的…

私域流量:探索營銷新紀元的高效之路

在當前的數字營銷領域&#xff0c;私域流量已經嶄露頭角&#xff0c;成為企業和品牌爭相追逐的新路徑。私域流量指的是企業或品牌通過自有渠道&#xff0c;如網站、APP、微信公眾號等&#xff0c;直接觸達的用戶流量。這種流量具有更高的自主性和可控性&#xff0c;對于提升營銷…

MS1242,替代ADS1242,24bit 高精度、低功耗模數轉換器

產品簡述 MS1242/MS1243 是一款高精度、寬動態范圍、 ?-Σ 模數轉 換芯片&#xff0c;其工作電壓為 2.7V 至 5.25V &#xff0c;可以達到 24bit 無失碼轉 換&#xff0c;有效精度可達 21bit 。 MS1242/MS1243 可以廣泛使用在工 業控制、稱重、液體 / 氣體化學分析、血液分…

spark 寫入 hudi時數據類型報錯

報錯信息如下&#xff1a; Caused by: org.apache.spark.sql.execution.QueryExecutionException: Parquet column cannot be converted in file hdfs://master:9000/user/hive/warehouse/ods_ds_hudi.db/order_info/19971201/77687054-08d3-4045-9529-1ca38e7de10b-0_0-65-57…

selenium相關地址匯總

webdriver下載 Chrome瀏覽器驅動下載地址&#xff1a;https://chromedriver.storage.googleapis.com/index.html Edge瀏覽器驅動下載地址&#xff1a;https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver) 或 https://msedgewebdriverstorage.z22.web.cor…

手眼標定 - 最終精度和誤差優化心得

手眼標定 - 標定誤差優化項 一、TCP標定誤差優化1、注意標定針擺放范圍2、TCP標定時的點次態與工作姿態盡可能保持相近 二、深度相機對齊矩陣誤差1、手動計算對齊矩陣 三、手眼標定拍照姿態1、TCP標定姿態優先2、水平放置棋盤格優先 為減少最終手眼標定的誤差&#xff0c;可做或…

Get職場新知識:做分析,用大數據分析工具

為什么企業每天累積那么多的數據&#xff0c;也做數據分析&#xff0c;但最后決策還是靠經驗&#xff1f;很大程度上是因為這些數據都被以不同的指標和存儲方式放在各自的系統中&#xff0c;這就導致了數據的分析口徑和標準不一致&#xff0c;無法在同一個分析軟件上做綜合分析…

Rsync+Sersync

服務器相關參數 源服務器 192.168.17.101 目標服務器&#xff08;同步到的服務器&#xff09; 192.168.17.103 ##目標服務器配置 ###1、配置rsync服務 1、安裝rsync yum -y install rsync 2、配置rsync vim /etc/rsyncd.conf 配置文件內容 uid root gid root use c…

Module build failed : Error : Vue packages version mismatch:

Vue packages version mismatch: - vue2.7.15 (E:\Workspace_ce\erp\erp-web\node_modules\vue\dist\vue.runtime.common.js) - vue-template-compiler2.6.11 (E:\Workspace_ce\erp\erp-web\node_modules\vue-template-compiler\package.json) 【問題解決了&#xff0c;我很不…

bootstrap:選項卡功能DEMO

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>選項卡</title> <link rel"stylesheet" type"text/css" href"/cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" />…

記一次測試環境git翻車經歷

本來想拉一個功能分支進行新的功能開發&#xff0c;合并代碼發現沒有沖突居然有文件被修改了&#xff0c;貿然選擇最近的一次回滾提交&#xff0c;沒想到不假思索的push -f 導致一部分dev主干的代碼不見了。 事故記錄 開發分支origin/dev&#xff0c;功能分支file 合并之后發…

Java 實現 文檔 添加 水印 工具類

一、pom 文件引用 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>…