在软件开发当中,不可避免需要将配置信息存放于配置文件当中。在 Java 项目当中,Spring 提供了非常强大的配置文件管理能力,这里就不多说了。今天分享一下 Go 语言中的配置文件管理类——viper

Viper 介绍

Viper 是 Go 语言中的一个流行配置管理库,它由开源社区开发并维护。它的主要功能是读取和解析各种配置文件(如 JSON、TOML、YAML、HCL 和 ENV 文件),并将这些配置值提供给应用程序。

Viper 功能还是很强大的,还支持优先级管理、自动重载配置、嵌套配置等等,而且简单易用。如果你使用 Go 语言开发项目需要配置管理,Viper 是不二的选择。

现在我们来进行 Viper 库的上手实践内容。

安装

打开终端并运行以下命令来安装 Viper

go get github.com/spf13/viper

简单的例子

下面是一个 Viper 使用的简单例子:

package main  
  
import (  
    "fmt"  
    "github.com/spf13/viper")  
  
func main() {  
    viper.SetConfigName("config") // 配置文件名称(无后缀)  
    viper.AddConfigPath("./conf") // 配置文件路径,  
    viper.SetConfigType("yaml")   // 配置文件后缀, 也可以是 json, toml, yaml, yml 等, 不设置则自动识别  
  
    // 读取配置文件, 如果出错则退出  
    if err := viper.ReadInConfig(); err != nil {  
       fmt.Printf("Error reading config file, %s\n", err)  
       return  
    }  
  
    // 获取配置值  
    appName := viper.GetString("app.name") // 读取字符串  
    port := viper.GetInt("app.port")       // 读取整型  
  
    fmt.Printf("App Name: %s\n", appName)  
    fmt.Printf("Port: %d\n", port)  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

我的 config.yaml 配置文件内容如下:

app:  
  name: "FunTester"  
  port: 8080
  • 1.
  • 2.
  • 3.

控制台打印:

App Name: FunTester
Port: 8080
  • 1.
  • 2.

其他

设置默认值

可以为配置项设置默认值,如果配置文件中没有指定该项,则使用默认值。使用语法:

viper.SetDefault("app.port", 8080)
  • 1.

自动重载

支持监视配置文件的变化,并在文件更改时自动重新加载配置。使用语法:

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("配置文件变更:", e.Name)
})
  • 1.
  • 2.
  • 3.
  • 4.

绑定环境变量

允许将环境变量与配置项绑定,使得环境变量可以覆盖配置文件中的值。使用语法:

viper.BindEnv("app.port", "APP_PORT")
  • 1.

合并配置

可以将多个配置文件合并,允许配置分散在多个文件中。使用语法:

viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.MergeInConfig()
  • 1.
  • 2.
  • 3.

动态赋值

可以通过编程方式动态设置和更新配置项。使用语法:

viper.Set("app.name", "New FunTester")
  • 1.

配置解析

支持将配置解析到结构体中,方便对复杂配置的管理。使用语法:

type Config struct {
    App struct {
        Name string
        Port int
    }
}

var config Config
if err := viper.Unmarshal(&config); err != nil {
    log.Fatalf("Unable to decode into struct: %v", err)
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

Viper 是一个功能全面、灵活且易于使用的配置管理库,适合各种规模的 Go 项目。它不仅支持多种配置格式,还提供了丰富的功能,如优先级管理、自动重载、动态配置等,帮助开发者高效地管理应用程序的配置。无论是简单的应用程序还是复杂的系统,Viper 都能提供强大的配置管理支持。