Go日常食用之读取yml配置文件|Go主题月

2,893 阅读2分钟

前言

在日常开发中,免不了读取各种各样的配置文件,比如json、yml、properties、env、ini等等格式的配置文件,今天我们将介绍在Go里面如何读取yml配置文件,并且根据不同的环境读取不同的配置~

准备

首先我们需要准备一份.yml的配置文件,这里简单贴出一份(取名为app.yml):

# app.yml
app:
  id: 1000
  name: juejin
db:
  name: test
  username: root
  password: 123456
  port: 3306
ticks:
  - 100
  - 200
  - 300
maps:
  1: 
  2: 
  3: 

定义结构

配置文件定义好了,我们就需要根据配置文件的结构来定义go语言的结构体:

type App struct {
	Id   int
	Name string
}

type DB struct {
	Name     string
	Username string
	Password string
	Port     int
}

type AppConfig struct {
	App   App
	DB    DB
	Ticks []int
	Maps  map[int]string
}

读取

接下来就开始读取yml配置数据,这里我们需要用到一个依赖库: github.com/spf13/viper 来读取我们的yml文件,具体方法步骤如下:

func main() {
	wd, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	c := &AppConfig{}
	v := viper.New()
	v.SetConfigName("app") //这里就是上面我们配置的文件名称,不需要带后缀名
	v.AddConfigPath(wd) //文件所在的目录路径
	v.SetConfigType("yml") //这里是文件格式类型
	err = v.ReadInConfig()
	if err != nil {
		log.Fatal("读取配置文件失败:", err)
		return
	}
	configs := v.AllSettings()
	for k, val := range configs {
		v.SetDefault(k, val)
	}
	err = v.Unmarshal(c) //反序列化至结构体
	if err != nil {
		log.Fatal("读取配置错误:", err)
	}
}

多环境配置

在开发过程中,免不了多环境的切换,例如开发环境和测试环境的配置可能会有一些不同,不过每次都去改默认配置文件太麻烦了,不过我们可以设置环境变量以适配多环境的配置读取,最终代码为:

func main() {
	wd, err := os.Getwd()
	if err != nil {
		panic(err)
	}
	c := &AppConfig{}
	v := viper.New()
	v.SetConfigName("app")
	v.AddConfigPath(wd)
	v.SetConfigType("yml")
	err = v.ReadInConfig()
	if err != nil {
		log.Fatal("读取配置文件失败:", err)
		return
	}
	configs := v.AllSettings()
	for k, val := range configs {
		v.SetDefault(k, val)
	}
	pa := os.Getenv("PROFILE_ACTIVE") //读取环境变量中设置的当前生效配置名称
	if pa != "" {
		v.SetConfigName(pa)
		v.AddConfigPath(wd)
		v.SetConfigType("yml")
		err = v.ReadInConfig()
		if err != nil {
			return
		}
	}
	err = v.Unmarshal(c)
	if err != nil {
		log.Fatal("读取配置错误:", err)
	}
}

后记

以上的方法都是基础简单的业务配置,且viper依赖也支持更多配置读取,如:JSON, TOML, YAML, HCL, envfile and Java properties;

😊 最后,感谢您的阅读,谢谢!