<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在日常開發中,YAML 格式的檔案基本上被預設為是組態檔,其內容因為縮排帶來的層級感看起來非常直觀和整潔。本文將會對 YAML
內容的讀取進行介紹。
yaml.v3
的包,可以讓我們在 Go
裡面輕鬆地操作 yaml
格式的資料(如將 yaml
格式轉成結構體等)。在使用 yaml.v3
包之前,我們需要先安裝它:
go get gopkg.in/yaml.v3
yaml 測試檔案內容:
mysql: url: 127.0.0.1 port: 3306 redis: host: 127.0.0.1 port: 6379
將 yaml
檔案的資料轉成自定義的結構體或 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", string(dataBytes)) config := Config{} err = yaml.Unmarshal(dataBytes, &config) if err != nil { fmt.Println("解析 yaml 檔案失敗:", err) return } fmt.Printf("config → %+vn", 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}} }
執行結果:
yaml 檔案的內容:
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
函數讀取檔案的內容,獲取 []byte
型別的資料;yaml
包的 Unmarshal(in []byte, out interface{})
函數將位元組陣列型別的資料解析到 Config
結構體變數裡,Unmarshal 函數需要傳遞兩個引數,第一個是 位元組陣列型別的資料,第二個是一個任意型別的資料,實際上要傳入一個指標變數,或者某個變數的地址值;config
和 mp
變數裡了,後續可以通過操作結構體和 map
獲取對應資料。viper
包可以幫助我們做很多東西,比如讀取 json
、yaml
、properties
等組態檔,讀取環境變數、讀取命令列引數等。在使用 viper
包之前,我們需要先安裝它:
go get github.com/spf13/viper
yaml 測試檔案內容:
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
函數,指定組態檔的名稱;
通過 SetConfigType
函數,指定組態檔的型別;
通過 AddConfigPath
函數,指定組態檔所在目錄,可以多次呼叫此函數,指定多個目錄;
通過 ReadInConfig
函數,尋找組態檔並讀取,操作的過程中可能會發生錯誤,如組態檔沒找到,組態檔的內容格式不正確等;
讀取檔案成功之後,可以通過 Get
函數,通過指定 key
獲取對應的 value
。
本文介紹了讀取 YAML 組態檔的兩種方式,第一種是通過 yaml.v3
包,第二種是通過 viper
包。如果是在專案裡解析組態檔,推薦使用 viper
包,它支援解析多種格式的組態檔,監聽組態檔的更新,修改組態檔等。
到此這篇關於Go語言讀取YAML 組態檔的兩種方式分享的文章就介紹到這了,更多相關Go讀取YAML 組態檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45