golang讀取yaml配置文件的方法實(shí)現(xiàn)
Viper
Viper是適用于Go應(yīng)用程序的完整配置解決方案。它被設(shè)計用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式。它支持以下特性:
- 設(shè)置默認(rèn)值
- 從JSON、TOML、YAML、HCL、envfile和Java properties 格式的配置文件讀取配置信息
- 實(shí)時監(jiān)控和重新讀取配置文件(可選)
- 從環(huán)境變量中讀取
- 從遠(yuǎn)程配置系統(tǒng)(etcd或Consul)讀取并監(jiān)控配置變化
- 從命令行參數(shù)讀取配置
- 從buffer讀取配置
- 顯式配置值
安裝
go get github.com/spf13/viper
使用
在項(xiàng)目根目錄創(chuàng)建config文件夾,在文件夾中創(chuàng)建local.yaml
servername: 'myserver' mysql: name: 'mysql'
在main.go中讀取配置文件的信息
package main import ( "log" "github.com/spf13/viper" ) func main() { v := viper.New() // 設(shè)置文件名稱 v.SetConfigFile("./config/local.yaml") if err := v.ReadInConfig(); err != nil { log.Panicln("讀取配置文件失敗") } servername := v.Get("servername") mysql := v.Get("mysql.name") log.Println(servername, mysql) }
使用結(jié)構(gòu)體映射yaml
修改配置文件
name: '服務(wù)名' port: 8080
使用
package main import ( "log" "github.com/spf13/viper" ) type ServerConfig struct { Name string `mapstructure:"name"` Port int `mapstructure:"port"` } func main() { cfg := ServerConfig{} v := viper.New() // 設(shè)置文件名稱 v.SetConfigFile("./config/local.yaml") if err := v.ReadInConfig(); err != nil { log.Panicln("讀取配置文件失敗") } if err := v.Unmarshal(&cfg); err != nil { log.Panicln(err) } log.Println(cfg) }
輸出
{服務(wù)名 8080}
結(jié)構(gòu)體嵌套讀取配置
配置文件
name: '服務(wù)名' port: 8080 mysql: host: '127.0.0.1' port: 3306
讀取配置
package main import ( "log" "github.com/spf13/viper" ) type ServerConfig struct { Name string `mapstructure:"name"` Port int `mapstructure:"port"` MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置 } type MysqlConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` } func main() { cfg := ServerConfig{} v := viper.New() // 設(shè)置文件名稱 v.SetConfigFile("./config/local.yaml") if err := v.ReadInConfig(); err != nil { log.Panicln("讀取配置文件失敗") } if err := v.Unmarshal(&cfg); err != nil { log.Panicln(err) } log.Println(cfg) }
輸出
{服務(wù)名 8080 {127.0.0.1 3306}}
根據(jù)不同環(huán)境讀取不同配置文件
在實(shí)際開發(fā)工作中,一般有不同的開發(fā)環(huán)境,會涉及到讀取不同的配置文件
這會運(yùn)用的golang的flag包
package main import ( "flag" "log" ) func main() { env := flag.String("env", "local", "運(yùn)行環(huán)境請輸入local dev test prod") flag.Parse() log.Println("當(dāng)前環(huán)境是" + *env) }
運(yùn)行
go run .\main.go -help
輸出
-env string
運(yùn)行環(huán)境請輸入local dev test prod (default "local")
這樣的話運(yùn)行
go run .\main.go -env dev
輸出
當(dāng)前環(huán)境是dev
利用flag讀取不同環(huán)境的配置文件
在項(xiàng)目更目錄新建config文件夾
并創(chuàng)建4個配置文件 local.yaml dev.yaml test.yaml prod.yaml
其中dev.yaml中
name: 'dev服務(wù)名' port: 8080 mysql: host: '127.0.0.1' port: 3306
在main.go中
package main import ( "flag" "fmt" "log" "github.com/spf13/viper" ) type ServerConfig struct { Name string `mapstructure:"name"` Port int `mapstructure:"port"` MysqlConfig MysqlConfig `mapstructure:"mysql"` // 嵌套的配置 } type MysqlConfig struct { Host string `mapstructure:"host"` Port int `mapstructure:"port"` } func main() { env := flag.String("env", "local", "運(yùn)行環(huán)境請輸入local dev test prod") flag.Parse() log.Println("當(dāng)前環(huán)境是" + *env) cfg := ServerConfig{} v := viper.New() var path string = fmt.Sprintf("./config/%s.yaml", *env) // 設(shè)置文件名稱 v.SetConfigFile(path) if err := v.ReadInConfig(); err != nil { log.Panicln("讀取配置文件失敗") } if err := v.Unmarshal(&cfg); err != nil { log.Panicln(err) } log.Println(cfg) }
運(yùn)行
go run .\main.go -env dev
輸出
當(dāng)前環(huán)境是dev
{dev服務(wù)名 8080 {127.0.0.1 3306}}
到此這篇關(guān)于golang讀取yaml配置文件的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang讀取yaml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang如何用type-switch判斷interface變量的實(shí)際存儲類型
這篇文章主要介紹了golang如何用type-switch判斷interface變量的實(shí)際存儲類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04goland 設(shè)置project gopath的操作
這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05利用ChatGPT編寫一個Golang圖像壓縮函數(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用ChatGPT幫我們寫了一個Golang圖像壓縮函數(shù),文中的示例代碼簡潔易懂,感興趣的小伙伴可以嘗試一下2023-04-04golang中byte和rune用法及新手易錯點(diǎn)總結(jié)
golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯點(diǎn)總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03