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

Golang解析yaml文件操作指南

 更新時(shí)間:2022年09月07日 11:33:49   作者:itsgopher  
之前一直從事java開(kāi)發(fā),習(xí)慣了使用yaml文件的格式,尤其是清晰的層次結(jié)構(gòu)、注釋,下面這篇文章主要給大家介紹了關(guān)于Golang解析yaml文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

yaml 文件是研發(fā)人員最常用的配置文件,yaml 文件的樹(shù)形結(jié)構(gòu)一直很受大家的歡迎。有過(guò) SpringBoot 開(kāi)發(fā)經(jīng)驗(yàn)的同學(xué)對(duì) yaml 非常熟悉,SpringBoot 整個(gè)項(xiàng)目的運(yùn)行就需要一個(gè) application.yaml 文件的支持,那么 Golang 項(xiàng)目中的 yaml 文件是如何解析的呢?Let`s dive in!

PS:根據(jù) godocs 的說(shuō)法,Golang 有三個(gè)強(qiáng)大的工具包支持 yaml 文件的解析,分別是:go-gypsy go-yaml goccy-yaml。本文中我們將討論其中 go-yaml 的用法。

對(duì) yaml 解析源碼感興趣的同學(xué)請(qǐng)進(jìn)入:go-yaml源碼鏈接

Simple Demo

第一步,我們創(chuàng)建好項(xiàng)目后導(dǎo)入 go-yaml 依賴(lài):

?  go-yaml go get gopkg.in/yaml.v3
go: added gopkg.in/yaml.v3 v3.0.1

第二步,創(chuàng)建 main 文件并在內(nèi)部編寫(xiě)一個(gè)簡(jiǎn)單的結(jié)構(gòu)體:

type ConfDemo struct {
  // 后面的 yaml 注解是在 yaml 文件中的屬性名
	A int      `yaml:"a"`
	B string   `yaml:"b"`
	C bool     `yaml:"c"`
	D []string `yaml:"d"`
	E struct {
		EA string `yaml:"ea"`
		EB string `yaml:"eb"`
	} `yaml:"e"`
}

第三步,在主目錄下創(chuàng)建 conf 目錄,并在 conf 目錄下創(chuàng)建 conf_demo.yaml 文件去編寫(xiě)我們的配置:

a: 1
b: "I am B"
c: true
d:
  - "I"
  - "am"
  - "D"
e:
  ea: "I am EA"
  eb: "I am EB"

第四步,編寫(xiě) main 函數(shù):

func main() {
  // 讀取文件所有內(nèi)容裝到 []byte 中
	bytes, err := ioutil.ReadFile("config/conf_demo.yaml")
	if err != nil {
		log.Fatalln(err)
	}
  // 創(chuàng)建配置文件的結(jié)構(gòu)體
	var confDemo ConfDemo
  // 調(diào)用 Unmarshall 去解碼文件內(nèi)容
  // 注意要穿配置結(jié)構(gòu)體的指針進(jìn)去
	err = yaml.Unmarshal(bytes, &confDemo)
	if err != nil {
		log.Fatalln(err)
	}
  // 調(diào)用 Unmarshall 對(duì)解碼出來(lái)的 confDemo 進(jìn)行編碼
  // 返回的 yml 是 []byte 類(lèi)型的
  yml, err := yaml.Marshal(confDemo)
	if err != nil {
		log.Fatalln(err)
	}
  // 輸出結(jié)果
	fmt.Printf("%#v\n", confDemo)
  fmt.Printf("%s\n", yml)
}

第五步,運(yùn)行并查看結(jié)果:

?  go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

go-yaml 其他解析方法

第一種解析方法即 simple Demo 中展現(xiàn)的 MarshallUnmarshall 方法,他們會(huì)直接在結(jié)構(gòu)體和字節(jié)流上進(jìn)行操作。但有時(shí)我們?yōu)榱藞D方便想把讀取字節(jié)流這一步也交給組件去執(zhí)行,這時(shí)候我們可以利用 yaml.Encoderyaml.Decoder。

yaml.Encoderyaml.Decoderio.Writerio.Reader 上進(jìn)行操作讀取其字節(jié)流并執(zhí)行編碼和解碼的動(dòng)作。我們將上面的例子以這種方法再次實(shí)現(xiàn)一遍:

func main() {
  // 利用 os.Open 獲取 File 對(duì)象,該對(duì)象實(shí)現(xiàn)了 io.Reader 和 io.Writer
	file, err := os.Open("config/conf_demo.yaml")
	if err != nil {
		log.Fatalln(err)
	}
  // 構(gòu)造新的 Decoder,并傳入 file
	decoder := yaml.NewDecoder(file)
  // 配置文件結(jié)構(gòu)體
	var confDemo ConfDemo
  // 解碼操作,注意要傳入地址
	err = decoder.Decode(&confDemo)
  // 輸出解碼結(jié)果
	fmt.Printf("%#v\n", confDemo)
	if err != nil {
		log.Fatalln(err)
	}
  // 構(gòu)造新的 Encoder,這里直接傳入了 os.Stdout,代表結(jié)果直接輸出到控制臺(tái)
	encoder := yaml.NewEncoder(os.Stdout)
  // 編碼并輸出
	err = encoder.Encode(confDemo)
	if err != nil {
		log.Fatalln(err)
	}
}

運(yùn)行結(jié)果:

?  go-yaml go run main.go
main.ConfDemo{A:1, B:"I am B", C:true, D:[]string{"I", "am", "D"}, E:struct { EA string "yaml:\"ea\""; EB string "yaml:\"eb\"" }{EA:"I am EA", EB:"I am EB"}}
a: 1
b: I am B
c: true
d:
    - I
    - am
    - D
e:
    ea: I am EA
    eb: I am EB

總結(jié)

到此這篇關(guān)于Golang解析yaml文件操作的文章就介紹到這了,更多相關(guān)Golang解析yaml文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫(xiě)法示例詳解

    Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫(xiě)法示例詳解

    這篇文章主要為大家介紹了Golang 工廠模式實(shí)戰(zhàn)寫(xiě)法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go之interface的具體使用

    Go之interface的具體使用

    這篇文章主要介紹了Go之interface的具體使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Golang中的泛型你真的了解嗎

    Golang中的泛型你真的了解嗎

    Golang?在?1.18?版本更新后引入了泛型,這是一個(gè)重要的更新,Gopher?萬(wàn)眾矚目,為?Golang?帶來(lái)了更多的靈活性和可重用性,今天,我們將深入探討泛型的概念、為什么需要泛型、泛型的語(yǔ)法,并探討如何在實(shí)踐中使用它
    2023-05-05
  • 深入理解Go中defer的機(jī)制

    深入理解Go中defer的機(jī)制

    本文主要介紹了Go中defer的機(jī)制,包括執(zhí)行順序、參數(shù)預(yù)計(jì)算、閉包和與返回值的交互,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • 使用Go語(yǔ)言解決Scan空格結(jié)束輸入問(wèn)題

    使用Go語(yǔ)言解決Scan空格結(jié)束輸入問(wèn)題

    這篇文章主要為大家介紹了使用Go語(yǔ)言來(lái)解決Scan空格結(jié)束輸入問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串

    GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串

    字符串在Go語(yǔ)言中以原生數(shù)據(jù)類(lèi)型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類(lèi)型(int、bool、float32、float64 等)一樣,下面這篇文章主要給大家介紹了關(guān)于GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • go-cqhttp環(huán)境配置及安裝過(guò)程

    go-cqhttp環(huán)境配置及安裝過(guò)程

    這篇文章主要介紹了go-cqhttp環(huán)境配置,包括go-cqhttp安裝及簡(jiǎn)單介紹,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析

    go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • golang中interface接口的深度解析

    golang中interface接口的深度解析

    什么是interface,簡(jiǎn)單的說(shuō),interface是一組method的組合,下面這篇文章主要給大家深度解析了關(guān)于golang中的interface接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱(chēng)和文件行號(hào)等操作

    Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱(chēng)和文件行號(hào)等操作

    這篇文章主要介紹了Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱(chēng)和文件行號(hào)等操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論

浑源县| 永昌县| 昭苏县| 广宗县| 扶绥县| 扶绥县| 应城市| 阳春市| 芮城县| 兴文县| 射洪县| 乌海市| 秦皇岛市| 昌图县| 溧水县| 深泽县| 江北区| 庆城县| 嘉善县| 吉木乃县| 富川| 深水埗区| 吉首市| 都安| 松溪县| 前郭尔| 太谷县| 张家港市| 沧源| 镶黄旗| 宝鸡市| 鸡西市| 虎林市| 大庆市| 拜泉县| 盈江县| 庐江县| 分宜县| 灵台县| 温州市| 广灵县|