golang讀取yaml配置文件的方法實(shí)現(xiàn)
Viper
Viper是適用于Go應(yīng)用程序的完整配置解決方案。它被設(shè)計(jì)用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式。它支持以下特性:
- 設(shè)置默認(rèn)值
- 從JSON、TOML、YAML、HCL、envfile和Java properties 格式的配置文件讀取配置信息
- 實(shí)時(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í)際開(kāi)發(fā)工作中,一般有不同的開(kāi)發(fā)環(huán)境,會(huì)涉及到讀取不同的配置文件
這會(huì)運(yùn)用的golang的flag包
package main
import (
"flag"
"log"
)
func main() {
env := flag.String("env", "local", "運(yùn)行環(huán)境請(qǐng)輸入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)境請(qǐng)輸入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個(gè)配置文件 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)境請(qǐng)輸入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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang應(yīng)用執(zhí)行Shell命令實(shí)戰(zhàn)
本文主要介紹了Golang應(yīng)用執(zhí)行Shell命令實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Go語(yǔ)言中:= 運(yùn)算符短變量聲明的使用小結(jié)
本文全面解析Go語(yǔ)言特有的:=運(yùn)算符,該運(yùn)算符兼具變量聲明和初始化功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
golang實(shí)現(xiàn)命令行程序的使用幫助功能
這篇文章介紹了golang實(shí)現(xiàn)命令行程序使用幫助的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作
這篇文章主要介紹了使用golang實(shí)現(xiàn)在屏幕上打印進(jìn)度條的操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

