Viper 全局config 快速入门| 青训营

35 阅读1分钟

背景

之前都是学 godotenv 做配置,好处是可以直接面对结构体进行索取。现在项目用 vipe 做全局 config 的配置,做一个入门记录

配置

读取

Viper 读取配置文件很简单

func readConfig() {
    viper.SetConfigType("yaml")
    viper.SetConfigFile("application.yaml")

    setDefaultConfig()

    if err := viper.ReadInConfig(); err != nil {
       if _, ok := err.(viper.ConfigFileNotFoundError); ok {
          panic("config file can not be founded")
       }
       panic("config file read error+" + err.Error())
    }
}

默认参数

默认参数比较麻烦的就是需要一个个添加,不知道能不能直接设定一个对象引入默认。

// setDefaultConfig == > set default configuration properties
func setDefaultConfig() {
    // mysql
    viper.SetDefault("mysql.username", "root")
    viper.SetDefault("mysql.password", "root")
    viper.SetDefault("mysql.host", "localhost")
    viper.SetDefault("mysql.port", "3306")
    viper.SetDefault("mysql.dataBase", "test")
    viper.SetDefault("mysql.driverName", "mysql")

}

面向结构体

开发好上面以后想要获取参数一般都是用viper.GetString()等 get 方法来获取,不太方便的是 IDE 无法进行预填充,你也不知道 config 具体有些啥东西,所以参考之前用 godotenv 的时候引入结构体的方法来设置全局参数:

type AppConfigSchema struct {
    // DataBase
    Database MySQL `mapstructure:"mysql"`
    DSN      string
}

// MySQL  == > mysql-database Yaml map to JSON
type MySQL struct {
    Password   string `mapstructure:"passWord"`
    UserName   string `mapstructure:"userName"`
    Host       string `mapstructure:"host"`
    DriverName string `mapstructure:"driverName"`
    Port       string `mapstructure:"port"`
    Database   string `mapstructure:"dataBase"`
}

// AppConfig == > global variable
var AppConfig = AppConfigSchema{}

添加一个 init 函数:

func init() {
    readConfig()
    unmarshallConfig()
    AppConfig.DSN = AppConfig.Database.UserName + ":" + AppConfig.Database.Password + "@tcp(" + AppConfig.Database.Host + ":" + AppConfig.Database.Port + ")/" + AppConfig.Database.Database + "?charset=utf8&parseTime=True"
}

在需要的地方这样使用:

// DSN
mysql.Open(config.AppConfig.DSN)
// other structured data
config.AppConfig.Database.Password