Go日常食用之读取yml配置文件

13次阅读
没有评论

前言

在日常开发中,免不了读取各种各样的配置文件,比如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;

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

1
憧憬Licoy
版权声明:本站原创文章,由憧憬Licoy2021-03-24发表,共计1584字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...