網(wǎng)站首頁 編程語言 正文
前言
在日常開發(fā)中,YAML 格式的文件基本上被默認為是配置文件,其內(nèi)容因為縮進帶來的層級感看起來非常直觀和整潔。本文將會對 YAML
內(nèi)容的讀取進行介紹。
yaml.v3 包
yaml.v3
的包,可以讓我們在 Go
里面輕松地操作 yaml
格式的數(shù)據(jù)(如將 yaml
格式轉(zhuǎn)成結(jié)構體等)。在使用 yaml.v3
包之前,我們需要先安裝它:
go get gopkg.in/yaml.v3
讀取 yaml 文件
yaml 測試文件內(nèi)容:
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379
將 yaml
文件的數(shù)據(jù)轉(zhuǎn)成自定義的結(jié)構體或 Map
import ( "fmt" "gopkg.in/yaml.v3" "os" ) type Config struct { Mysql Mysql `json:"mysql"` Redis Redis `json:"redis"` } type Mysql struct { Url string Port int } type Redis struct { Host string Port int } func main() { dataBytes, err := os.ReadFile("test.yaml") if err != nil { fmt.Println("讀取文件失敗:", err) return } fmt.Println("yaml 文件的內(nèi)容: \n", string(dataBytes)) config := Config{} err = yaml.Unmarshal(dataBytes, &config) if err != nil { fmt.Println("解析 yaml 文件失敗:", err) return } fmt.Printf("config → %+v\n", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}} mp := make(map[string]any, 2) err = yaml.Unmarshal(dataBytes, mp) if err != nil { fmt.Println("解析 yaml 文件失敗:", err) return } fmt.Printf("map → %+v", config) // config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}} }
執(zhí)行結(jié)果:
yaml 文件的內(nèi)容:
?mysql:
? url: 127.0.0.1
? port: 3306
redis:
? host: 127.0.0.1
? port: 6379
config → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
map → {Mysql:{Url:127.0.0.1 Port:3306} Redis:{Host:127.0.0.1 Port:6379}}
- 首先通過
os
包里的ReadFile
函數(shù)讀取文件的內(nèi)容,獲取[]byte
類型的數(shù)據(jù); - 通過
yaml
包的Unmarshal(in []byte, out interface{})
函數(shù)將字節(jié)數(shù)組類型的數(shù)據(jù)解析到Config
結(jié)構體變量里,Unmarshal 函數(shù)需要傳遞兩個參數(shù),第一個是 字節(jié)數(shù)組類型的數(shù)據(jù),第二個是一個任意類型的數(shù)據(jù),實際上要傳入一個指針變量,或者某個變量的地址值; - 通過打印結(jié)果可以看到 yaml 文件的內(nèi)容已經(jīng)成功解析到結(jié)構體
config
和mp
變量里了,后續(xù)可以通過操作結(jié)構體和map
獲取對應數(shù)據(jù)。
viper 包
viper
包可以幫助我們做很多東西,比如讀取 json
、yaml
、properties
等配置文件,讀取環(huán)境變量、讀取命令行參數(shù)等。在使用 viper
包之前,我們需要先安裝它:
go get github.com/spf13/viper
讀取 yaml 文件
yaml 測試文件內(nèi)容:
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379
代碼示例:
import ( "fmt" "github.com/spf13/viper" ) func main() { // 設置配置文件的名字 viper.SetConfigName("test") // 設置配置文件的類型 viper.SetConfigType("yaml") // 添加配置文件的路徑,指定 config 目錄下尋找 viper.AddConfigPath("./config") // 尋找配置文件并讀取 err := viper.ReadInConfig() if err != nil { panic(fmt.Errorf("fatal error config file: %w", err)) } fmt.Println(viper.Get("mysql")) // map[port:3306 url:127.0.0.1] fmt.Println(viper.Get("mysql.url")) // 127.0.0.1 }
通過 SetConfigName
函數(shù),指定配置文件的名稱;
通過 SetConfigType
函數(shù),指定配置文件的類型;
通過 AddConfigPath
函數(shù),指定配置文件所在目錄,可以多次調(diào)用此函數(shù),指定多個目錄;
通過 ReadInConfig
函數(shù),尋找配置文件并讀取,操作的過程中可能會發(fā)生錯誤,如配置文件沒找到,配置文件的內(nèi)容格式不正確等;
讀取文件成功之后,可以通過 Get
函數(shù),通過指定 key
獲取對應的 value
。
小結(jié)
本文介紹了讀取 YAML 配置文件的兩種方式,第一種是通過 yaml.v3
包,第二種是通過 viper
包。如果是在項目里解析配置文件,推薦使用 viper
包,它支持解析多種格式的配置文件,監(jiān)聽配置文件的更新,修改配置文件等。
原文鏈接:https://juejin.cn/post/7178146763927683127
相關推薦
- 2022-04-19 Django的開發(fā)步驟原來是這樣的_python
- 2022-03-19 C#?壓榨cpu的辦法(推薦)_C#教程
- 2022-05-08 python列表的構造方法list()_python
- 2022-12-13 Android?itemDecoration接口實現(xiàn)吸頂懸浮標題_Android
- 2022-07-21 Error: rsync: [sender] safe_read failed to read 4
- 2022-05-21 Python學習之包與模塊詳解_python
- 2022-09-29 利用LyScript實現(xiàn)應用層鉤子掃描器_python
- 2022-10-09 django中的自定義分頁器的實現(xiàn)示例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支