The viper Package: Using Command-Line Flags
Let’s learn about the viper package.
We'll cover the following
Now that we know about working with JSON, XML, and YAML data in Go, we are ready to learn about the viper
package.
The flag
package
Flags are specially formatted strings that are passed into a program to control its behavior. Dealing with flags on our own might become very frustrating if we want to support multiple flags and options. Go offers the flag
package for working with command-line options, parameters, and flags.
The viper
package
Although flag
can do many things, it is not as capable as other external Go packages. Thus, if we are developing simple UNIX system command-line utilities, we might find the flag
package very interesting and useful. Of course, creating simple command-line utilities isn’t the primary learning objective of this course! Therefore, we’ll skip the flag
package and introduce an external package named viper
, which is a powerful Go package that supports a plethora of options. viper
uses the pflag
package instead of flag
, which is also illustrated in the code we will look at in the following sections.
All viper
projects follow a pattern. First, we initialize viper
, and then we define the elements that interest us. After that, we get these elements and read their values in order to use them. The desired values can be taken either directly, as happens when we are using the flag
package from the standard Go library, or indirectly using configuration files. When using formatted configuration files in the JSON, YAML, TOML, HCL, or Java properties format, viper
does all the parsing for us, which saves us from having to write and debug lots of Go code. viper
also allows us to extract and save values in Go structures. However, this requires that the fields of the Go structure match the keys of the configuration file.
The home page of viper
is on GitHub. Please note that we are not obliged to use every capability of viper
in our tools—just the features that we want. The general rule is to use the features of Viper that simplify our code. Put simply, if our command-line utility requires too many command-line parameters and flags, then it would be better to use a configuration file instead.
Using command-line flags
The first example shows how to write a simple utility that accepts two values as command-line parameters and prints them on screen for verification. This means that we are going to need two command-line flags for these parameters.
Starting from Go version 1.16, using modules is the default behavior, which the viper
package needs to use. So, we need to put useViper.go
, which is the name of the source file, inside ~/go
for things to work. For the GitHub username educative
we will run the following commands:
Get hands-on with 1400+ tech skills courses.