Golang實(shí)現(xiàn)yaml配置文件的解析
代碼
需要建立3個(gè)文件,目錄結(jié)構(gòu)如下:
配置文件 conf.yaml
redis: host: "127.0.0.1" port: 6379 db: 11 pass: "aaaaaa"
go模塊文件 go.mod,用于管理項(xiàng)目的依賴關(guān)系和版本信息。
module readyaml
主程序 readyaml.go
package main import ( "github.com/spf13/viper" "fmt" ) // 配置文件 type Conf struct { Redis RedisConfig `mapstructure:"redis"` } // redis配置數(shù)據(jù) type RedisConfig struct{ HOST string `mapstructure:"host"` PORT int `mapstructure:"port"` DB int `mapstructure:"db"` PASS string `mapstructure:"pass"` } func getConf() Conf{ var cfg Conf // 設(shè)置待讀取配置文件的名字 viper.SetConfigName("conf") // 設(shè)置待讀取配置文件的格式 viper.SetConfigType("yaml") // 添加配置文件的檢索路徑 viper.AddConfigPath(".") // 讀取數(shù)據(jù) if err := viper.ReadInConfig(); err != nil { fmt.Printf("ReadInConfig error : %s\n", err) return cfg } // 測試 1 : 直接獲取數(shù)據(jù) fmt.Printf("Host %s\n", viper.GetString("redis.host")) fmt.Printf("PORT %d\n", viper.GetInt("redis.port")) fmt.Printf("DB %d\n", viper.GetInt("redis.db")) fmt.Printf("PASS %s\n", viper.GetString("redis.pass")) // 通過viper模塊,反序列化成對象 if err := viper.Unmarshal(&cfg); err != nil { fmt.Printf("Unmarshal error : %s\n", err) return cfg } return cfg } var cfg Conf = getConf() func main() { // 打印測試 fmt.Printf("HOST %s, PORT %d, DB %d, PASS %s len(PASS) %d\n", cfg.Redis.HOST, cfg.Redis.PORT, cfg.Redis.DB, cfg.Redis.PASS, len(cfg.Redis.PASS) ) }
首先,需要整理和更新項(xiàng)目的依賴關(guān)系
go mod tidy
這個(gè)過程中,會下載缺失的模塊。go.mod文件會進(jìn)行更新,并且多出一個(gè)go.sum文件,用于記錄項(xiàng)目依賴樹中所有模塊的特定版本內(nèi)容的預(yù)期哈希值。
在這個(gè)過程中,如果無法聯(lián)網(wǎng),或者無法訪問源,則會報(bào)錯(cuò)如下圖。如果沒有報(bào)錯(cuò),則可以直接執(zhí)行第二步。
可以使用國內(nèi)go代理解決這個(gè)問題,此處用到GOPROXY環(huán)境變量。
執(zhí)行 export GOPROXY=https://goproxy.cn,然后繼續(xù)執(zhí)行 go mod tidy
也可以在 /etc/bashrc或者~/.bashrc文件添加這個(gè)命令,這樣每次登錄會話會自動添加此環(huán)境變量。
第二步,直接執(zhí)行腳本: go run readyaml.go ;
也可以編譯后再執(zhí)行二進(jìn)制文件: go build readyaml.go,編譯后,創(chuàng)建了編譯后的文件 readyaml。
直接執(zhí)行 ./readyaml。具體操作,如下圖所示:
避坑:定義的數(shù)據(jù)結(jié)構(gòu)成員變量必須是大寫字母開頭,不然 viper.Unmarshal 這一步可能映射不成功。這是由于在golang中,以小寫字母開頭定義的標(biāo)識符(如變量名、函數(shù)名、類型名等)只能在本包內(nèi)訪問,是不能跨包訪問的。
也就是:type RedisConfig struct 和 type Conf struct 的成員變量需要大寫開頭。
以上就是Golang實(shí)現(xiàn)yaml配置文件的解析的詳細(xì)內(nèi)容,更多關(guān)于Golang解析yaml文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決golang編譯提示dial tcp 172.217.160.113:443: con
這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問題完美解決,需要的朋友可以參考下2023-02-02Golang實(shí)現(xiàn)IP地址轉(zhuǎn)整數(shù)的方法詳解
在 Go 語言中,將 IP 地址轉(zhuǎn)換為整數(shù)涉及到解析 IP 地址并處理其字節(jié)表示,本文給大家介紹了Golang實(shí)現(xiàn)IP地址轉(zhuǎn)整數(shù)的方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-02-02GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對象
這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06gin項(xiàng)目部署到服務(wù)器并后臺啟動的步驟
本文主要介紹了gin項(xiàng)目部署到服務(wù)器并后臺啟動的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02