go-viper

  1. Viper
    1. 主要特性:
    2. 安装
    3. 基本使用
      1. 1. 读取配置文件
      2. 2. 通过环境变量获取配置
      3. 3. 设置默认值
      4. 4. 热加载配置文件
    4. 总结

Viper

官方文档

spf13/viper: Go configuration with fangs (github.com)

go-viper 是 Go 语言中常用的配置管理库,它可以帮助开发者轻松地处理应用程序中的配置文件、环境变量、命令行参数等。viper 的设计使其能够支持多种配置格式,灵活且易于使用。

主要特性:

  1. 多种配置格式支持:支持 JSON、TOML、YAML、HCL、TOML、Java properties 等多种格式的配置文件。
  2. 环境变量支持:可以直接从系统环境变量中读取配置。
  3. 命令行参数集成:与 flag 包结合,支持从命令行参数获取配置。
  4. 热重载配置:支持配置文件的动态更新,无需重启应用程序。
  5. 嵌套配置:支持深度嵌套的配置结构,便于复杂应用的管理。
  6. 默认值设置:可以为未提供的配置项设置默认值。
  7. 配置文件的优先级管理:支持多种配置源(文件、环境变量、命令行参数等)并根据优先级读取。

安装

你可以通过 go get 来安装 viper

go get github.com/spf13/viper

基本使用

1. 读取配置文件

package main

import (
    "fmt"
    "github.com/spf13/viper"
)

func main() {
    // 设置配置文件名(不需要文件扩展名)
    viper.SetConfigName("config")
    // 设置配置文件路径
    viper.AddConfigPath(".")
    // 配置文件格式 (例如: "yaml", "json")
    viper.SetConfigType("yaml")

    // 读取配置文件
    err := viper.ReadInConfig()
    if err != nil {
        panic(fmt.Errorf("无法读取配置文件: %s \n", err))
    }

    // 读取配置项
    port := viper.GetInt("server.port")
    fmt.Printf("Server port: %d\n", port)
}

在上述代码中,我们读取了一个名为 config.yaml 的配置文件,该文件可以包含如下内容:

server:
  port: 8080

2. 通过环境变量获取配置

viper 支持从环境变量中获取配置项,通常用于在不同环境(开发、测试、生产)下运行应用时动态加载配置信息。

package main

import (
    "fmt"
    "github.com/spf13/viper"
)

func main() {
    // 绑定环境变量
    viper.AutomaticEnv()

    // 设置环境变量前缀
    viper.SetEnvPrefix("app")

    // 读取环境变量
    port := viper.GetInt("PORT")
    fmt.Printf("Server port from env: %d\n", port)
}

在终端中设置环境变量并运行:

export APP_PORT=9090
go run main.go

输出将会是:

Server port from env: 9090

3. 设置默认值

如果配置项不存在,可以通过 viper 设置默认值。

package main

import (
    "fmt"
    "github.com/spf13/viper"
)

func main() {
    // 设置默认值
    viper.SetDefault("server.port", 3000)

    // 读取配置项
    port := viper.GetInt("server.port")
    fmt.Printf("Default Server port: %d\n", port)
}

4. 热加载配置文件

viper 支持热加载配置文件,适用于需要动态更新配置的场景。例如,在开发服务器中更新配置时无需重启。

package main

import (
    "fmt"
    "github.com/spf13/viper"
    "time"
)

func main() {
    viper.SetConfigFile("config.yaml")
    viper.WatchConfig()

    viper.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("Config file changed:", e.Name)
    })

    err := viper.ReadInConfig()
    if err != nil {
        panic(fmt.Errorf("Fatal error config file: %w \n", err))
    }

    for {
        fmt.Println("Server port:", viper.GetInt("server.port"))
        time.Sleep(time.Second * 5)
    }
}

总结

viper 提供了一个强大且灵活的配置管理方案,支持多种配置源和动态配置更新,是 Go 项目中常用的库之一。在实际项目中,可以将其与 cobra 等命令行工具结合使用,来实现更复杂的配置管理和应用控制。

github