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

1,952次阅读
一条评论

共计 1584 个字符,预计需要花费 4 分钟才能阅读完成。

前言

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

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

正文完
使用官方微信小程序体验更多功能
post-qrcode
 8
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 2021-03-24发表,共计1584字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(一条评论)
今日新闻 评论达人 LV.1
2021-04-29 00:28:18 回复

文章不错支持一下吧

 Windows  Chrome  中国广西贺州市联通