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

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

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

前言

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

yaml.v3 包

yaml.v3 的包,可以讓我們在 Go 里面輕松地操作 yaml 格式的數(shù)據(jù)(如將 yaml 格式轉(zhuǎn)成結(jié)構(gòu)體等)。在使用 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é)構(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}}

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

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

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

小結(jié)

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

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

相關(guān)文章

  • 詳解Go語言如何高效解壓ZIP文件

    詳解Go語言如何高效解壓ZIP文件

    在日常開發(fā)中,我們經(jīng)常需要處理 ZIP 文件,本文主要為大家介紹一個(gè)使用 Go 語言編寫的高效 ZIP 文件解壓工具,希望對大家有一定的幫助
    2025-03-03
  • Golang中類型轉(zhuǎn)換利器cast庫的用法詳解

    Golang中類型轉(zhuǎn)換利器cast庫的用法詳解

    cast庫是一個(gè)簡潔而強(qiáng)大的第三方庫,它的主要功能是實(shí)現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個(gè)常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應(yīng)用吧
    2024-11-11
  • GoLang完整實(shí)現(xiàn)快速列表

    GoLang完整實(shí)現(xiàn)快速列表

    這篇文章主要介紹了GoLang完整實(shí)現(xiàn)快速列表,列表是一種非連續(xù)的存儲容器,由多個(gè)節(jié)點(diǎn)組成,節(jié)點(diǎn)通過一些 變量 記錄彼此之間的關(guān)系,列表有多種實(shí)現(xiàn)方法,如單鏈表、雙鏈表等
    2022-12-12
  • Go errors默認(rèn)加堆棧信息的作用分析

    Go errors默認(rèn)加堆棧信息的作用分析

    這篇文章主要為大家介紹了Go errors默認(rèn)加堆棧信息作用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串

    Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串

    golang中提供了各種類型之間的轉(zhuǎn)換方法,其中,將其他類型轉(zhuǎn)換為字符串類型是常見的操作,本文主要介紹了Go實(shí)現(xiàn)將io.Writer轉(zhuǎn)換成字符串,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Go語言常用條件判斷空值邏輯的使用

    Go語言常用條件判斷空值邏輯的使用

    本文主要介紹了Go語言常用條件判斷空值邏輯的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語言共享內(nèi)存讀寫實(shí)例分析

    Go語言共享內(nèi)存讀寫實(shí)例分析

    這篇文章主要介紹了Go語言共享內(nèi)存讀寫方法,實(shí)例分析了共享內(nèi)存的原理與讀寫技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語言檢測文件是否存在的方法

    go語言檢測文件是否存在的方法

    這篇文章主要介紹了go語言檢測文件是否存在的方法,實(shí)例分析了Go語言文件操作的相關(guān)技巧,需要的朋友可以參考下
    2015-03-03
  • 一文帶你深入了解Golang中的參數(shù)傳遞機(jī)制

    一文帶你深入了解Golang中的參數(shù)傳遞機(jī)制

    值傳遞和引用傳遞是編程語言中兩種主要的參數(shù)傳遞方式,決定了函數(shù)調(diào)用過程中實(shí)參如何影響形參以及函數(shù)內(nèi)部對形參的修改是否會影響到原始實(shí)參,下面就跟隨小編一起深入了解下golang中參數(shù)傳遞機(jī)制吧
    2024-01-01
  • Go?Java算法之單詞搜索示例詳解

    Go?Java算法之單詞搜索示例詳解

    這篇文章主要為大家介紹了Go?Java算法之單詞搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

墨脱县| 邵武市| 青海省| 二连浩特市| 分宜县| 百色市| 尉氏县| 阳朔县| 营口市| 厦门市| 安吉县| 镶黄旗| 双柏县| 凌云县| 虞城县| 肥城市| 当涂县| 花莲县| 台江县| 沅江市| 罗江县| 福建省| 平泉县| 漳平市| 丽江市| 改则县| 乌什县| 山丹县| 靖州| 正阳县| 南乐县| 建宁县| 武安市| 扶绥县| 灵台县| 深州市| 宜良县| 彰武县| 基隆市| 长海县| 芒康县|