Master Go Configuration with Viper: Quick Setup and Advanced Features

Learn how to install the Viper library in Go, read and parse YAML, JSON, TOML, and ENV files, and leverage features like default values, automatic reload, environment variable binding, merging configs, dynamic updates, and struct unmarshalling through clear code examples.

FunTester
FunTester
FunTester
Master Go Configuration with Viper: Quick Setup and Advanced Features

Viper Introduction

Viper is a popular open‑source configuration management library for Go. It can read and parse various file formats such as JSON, TOML, YAML, HCL, and ENV, and then expose the configuration values to the application.

Installation

Open a terminal and run the following command to add Viper to your project:

go get github.com/spf13/viper

Simple Example

The following program demonstrates basic usage: installing a configuration file, setting its type, reading values, and printing them.

package main

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

func main() {
    viper.SetConfigName("config") // name of config file (without extension)
    viper.AddConfigPath("./conf") // path to look for the config file
    viper.SetConfigType("yaml")   // could be json, toml, yaml, etc.

    // read the config file; exit on error
    if err := viper.ReadInConfig(); err != nil {
        fmt.Printf("Error reading config file, %s
", err)
        return
    }

    // retrieve configuration values
    appName := viper.GetString("app.name") // string value
    port := viper.GetInt("app.port")        // integer value

    fmt.Printf("App Name: %s
", appName)
    fmt.Printf("Port: %d
", port)
}

Corresponding config.yaml file:

app:
  name: "FunTester"
  port: 8080

Running the program prints:

App Name: FunTester
Port: 8080

Additional Features

Setting Default Values

You can provide a fallback value for a key that is missing from the configuration file:

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

Automatic Reload

Viper can watch the configuration file for changes and reload it automatically:

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

Binding Environment Variables

Environment variables can override configuration values by binding them to keys:

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

Merging Configurations

Multiple configuration files can be merged, allowing settings to be split across files:

viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.MergeInConfig()

Dynamic Assignment

Configuration values can be changed programmatically at runtime:

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

Configuration Parsing

Viper can unmarshal configuration data directly into Go structs, which is handy for complex settings:

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

var cfg Config
if err := viper.Unmarshal(&cfg); err != nil {
    log.Fatalf("Unable to decode into struct: %v", err)
}

Viper offers a comprehensive, flexible, and easy‑to‑use solution for configuration management in Go projects of any size, supporting multiple formats, priority handling, automatic reloads, dynamic updates, and more.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

BackendConfigurationGoYAMLTutorialViper
FunTester
Written by

FunTester

10k followers, 1k articles | completely useless

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.