欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言讀取YAML 配置文件的兩種方式分享

 更新時(shí)間:2022年12月18日 09:51:48   作者:陳明勇  
在日常開(kāi)發(fā)中,YAML 格式的文件基本上被默認(rèn)為是配置文件,其內(nèi)容因?yàn)榭s進(jìn)帶來(lái)的層級(jí)感看起來(lái)非常直觀和整潔。本文分享了讀取YAML 配置文件的兩種方式,需要的可以參考一下

前言

在日常開(kāi)發(fā)中,YAML 格式的文件基本上被默認(rèn)為是配置文件,其內(nèi)容因?yàn)榭s進(jìn)帶來(lái)的層級(jí)感看起來(lái)非常直觀和整潔。本文將會(huì)對(duì) YAML 內(nèi)容的讀取進(jìn)行介紹。

yaml.v3 包

yaml.v3 的包,可以讓我們?cè)?Go 里面輕松地操作 yaml 格式的數(shù)據(jù)(如將 yaml 格式轉(zhuǎn)成結(jié)構(gòu)體等)。在使用 yaml.v3 包之前,我們需要先安裝它:

go get gopkg.in/yaml.v3

讀取 yaml 文件

yaml 測(cè)試文件內(nèi)容:

mysql:
  url: 127.0.0.1
  port: 3306

redis:
  host: 127.0.0.1
  port: 6379

yaml 文件的數(shù)據(jù)轉(zhuǎn)成自定義的結(jié)構(gòu)體或 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}}

  • 首先通過(guò) os 包里的 ReadFile 函數(shù)讀取文件的內(nèi)容,獲取 []byte 類(lèi)型的數(shù)據(jù);
  • 通過(guò) yaml 包的 Unmarshal(in []byte, out interface{}) 函數(shù)將字節(jié)數(shù)組類(lèi)型的數(shù)據(jù)解析到 Config 結(jié)構(gòu)體變量里,Unmarshal 函數(shù)需要傳遞兩個(gè)參數(shù),第一個(gè)是 字節(jié)數(shù)組類(lèi)型的數(shù)據(jù),第二個(gè)是一個(gè)任意類(lèi)型的數(shù)據(jù),實(shí)際上要傳入一個(gè)指針變量,或者某個(gè)變量的地址值;
  • 通過(guò)打印結(jié)果可以看到 yaml 文件的內(nèi)容已經(jīng)成功解析到結(jié)構(gòu)體 configmp 變量里了,后續(xù)可以通過(guò)操作結(jié)構(gòu)體和 map 獲取對(duì)應(yīng)數(shù)據(jù)。

viper 包

viper 包可以幫助我們做很多東西,比如讀取 jsonyaml、properties 等配置文件,讀取環(huán)境變量、讀取命令行參數(shù)等。在使用 viper 包之前,我們需要先安裝它:

go get github.com/spf13/viper

讀取 yaml 文件

yaml 測(cè)試文件內(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() {
    // 設(shè)置配置文件的名字
    viper.SetConfigName("test")
    // 設(shè)置配置文件的類(lèi)型
    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
}

通過(guò) SetConfigName 函數(shù),指定配置文件的名稱(chēng);

通過(guò) SetConfigType 函數(shù),指定配置文件的類(lèi)型;

通過(guò) AddConfigPath 函數(shù),指定配置文件所在目錄,可以多次調(diào)用此函數(shù),指定多個(gè)目錄;

通過(guò) ReadInConfig 函數(shù),尋找配置文件并讀取,操作的過(guò)程中可能會(huì)發(fā)生錯(cuò)誤,如配置文件沒(méi)找到,配置文件的內(nèi)容格式不正確等;

讀取文件成功之后,可以通過(guò) Get 函數(shù),通過(guò)指定 key 獲取對(duì)應(yīng)的 value。

小結(jié)

本文介紹了讀取 YAML 配置文件的兩種方式,第一種是通過(guò) yaml.v3 包,第二種是通過(guò) viper 包。如果是在項(xiàng)目里解析配置文件,推薦使用 viper 包,它支持解析多種格式的配置文件,監(jiān)聽(tīng)配置文件的更新,修改配置文件等。

到此這篇關(guān)于Go語(yǔ)言讀取YAML 配置文件的兩種方式分享的文章就介紹到這了,更多相關(guān)Go讀取YAML 配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go Gin框架中的binding驗(yàn)證器使用小結(jié)

    Go Gin框架中的binding驗(yàn)證器使用小結(jié)

    Gin框架中的binding驗(yàn)證器為我們提供了簡(jiǎn)便的數(shù)據(jù)綁定和驗(yàn)證功能,通過(guò)合理使用binding和validate標(biāo)簽,我們可以確保API接口的數(shù)據(jù)合法性和完整性,這篇文章主要介紹了Go Gin框架中的binding驗(yàn)證器使用指南,需要的朋友可以參考下
    2024-07-07
  • Golang中錯(cuò)誤處理機(jī)制詳解

    Golang中錯(cuò)誤處理機(jī)制詳解

    平時(shí)在項(xiàng)目開(kāi)發(fā)過(guò)程中少不了對(duì)錯(cuò)誤的處理,一個(gè)好用的系統(tǒng)首先要確保其健壯性,不能經(jīng)常發(fā)生錯(cuò)誤就卡死之類(lèi)的情況,為了讓我們的程序更加健壯,我們就需要知道golang里的錯(cuò)誤處理機(jī)制是怎么樣的,這篇文章帶大家一起學(xué)習(xí),需要的朋友跟著小編一起來(lái)看看吧
    2024-05-05
  • Golang記錄、計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡(jiǎn)單方法

    Golang記錄、計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡(jiǎn)單方法

    這篇文章主要介紹了Golang記錄、計(jì)算函數(shù)執(zhí)行耗時(shí)、運(yùn)行時(shí)間的一個(gè)簡(jiǎn)單方法,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-07-07
  • GO語(yǔ)言中回調(diào)函數(shù)的使用

    GO語(yǔ)言中回調(diào)函數(shù)的使用

    本文主要介紹了GO語(yǔ)言中回調(diào)函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang中Interface接口的三個(gè)特性

    Golang中Interface接口的三個(gè)特性

    本文詳細(xì)講解了Golang中Interface接口的三個(gè)特性,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒(méi)有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • 使用go在mangodb中進(jìn)行CRUD操作

    使用go在mangodb中進(jìn)行CRUD操作

    這篇文章主要介紹了使用go在mangodb中進(jìn)行CRUD操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Go中使用gjson來(lái)操作JSON數(shù)據(jù)的實(shí)現(xiàn)

    Go中使用gjson來(lái)操作JSON數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Go中使用gjson來(lái)操作JSON數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過(guò)交叉編譯的方式在一個(gè)平臺(tái)輸出多個(gè)平臺(tái)可運(yùn)行的二進(jìn)制包,本文給大家詳細(xì)介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Go實(shí)現(xiàn)字符串與數(shù)字的高效轉(zhuǎn)換

    Go實(shí)現(xiàn)字符串與數(shù)字的高效轉(zhuǎn)換

    在軟件開(kāi)發(fā)的世界里,數(shù)據(jù)類(lèi)型轉(zhuǎn)換是一項(xiàng)基礎(chǔ)而重要的技能,尤其在Go語(yǔ)言這樣類(lèi)型嚴(yán)格的語(yǔ)言中,正確高效地進(jìn)行類(lèi)型轉(zhuǎn)換對(duì)于性能優(yōu)化和代碼質(zhì)量至關(guān)重要,本文給大家介紹了Go實(shí)現(xiàn)字符串與數(shù)字的高效轉(zhuǎn)換,需要的朋友可以參考下
    2024-02-02

最新評(píng)論