Parsing command-line flags in Go

Golang has a built-in package called flag that enables one to parse command-line flags. The flag package allows you to define StringBool, or Int flags.

To be able to access the parameters passed as arguments to the command line execution of your program, three steps need to be completed.

  1. Define the flag.
  2. Bind the flag.
  3. Parse the flag.

Syntax

An example of how flag is used with command-line arguments is shown below.

flag.Int("n", def_val, description)

Parameters

  • "n": the variable to be parsed.
  • def_val: the default value of the variable.
  • description: the description of the flag.

Define the flag

var help = flag.Bool("help", false, "Show help")
var boolFlag = false
var stringFlag = "Hello There!"
var intFlag int

Bind the flag

flag.BoolVar(&boolFlag, "boolFlag", false, "A boolean flag")
flag.StringVar(&stringFlag, "stringFlag", "Hello There!", "A string flag")
flag.IntVar(&intFlag, "intFlag", 4, "An integer flag")
view raw goflag_bind.go hosted with ❤ by GitHub

Parse the flag

flag.Parse()
view raw goflag_parse.go hosted with ❤ by GitHub

Bringing it all together

package main
import (
"flag"
"fmt"
"os"
)
// Define the flag
var help = flag.Bool("help", false, "Show help")
var boolFlag = false
var stringFlag = "Hello There!"
var intFlag int
func main() {
// Bind the flag
flag.BoolVar(&boolFlag, "boolFlag", false, "A boolean flag")
flag.StringVar(&stringFlag, "stringFlag", "Hello There!", "A string flag")
flag.IntVar(&intFlag, "intFlag", 4, "An integer flag")
// Parse the flag
flag.Parse()
// Usage Demo
if *help {
flag.Usage()
os.Exit(0)
}
fmt.Println("Boolean Flag is ", boolFlag)
fmt.Println("String Flag is ", stringFlag)
fmt.Println("Int Flag is ", intFlag)
}
view raw goflags.go hosted with ❤ by GitHub

To run the code in the terminal, the following command is added.

./main -boolFlag=true -stringFlag hi

You can use -h or --help flags to get automatically generated help text for the command-line program.

Checking if the flag is set explicitly.

If you would like to check explicitly if a flag has been set in Go, you can use the flag.Visit() function in Go.

func isFlagPassed(name string) bool {
found := false
flag.Visit(func(f *flag.Flag) {
if f.Name == name {
found = true
}
})
return found
}

This function needs to be called after the flag.Parse()

package main
import (
"flag"
"fmt"
"os"
)
// Define the flag
var help = flag.Bool("help", false, "Show help")
var boolFlag = false
var stringFlag = "Hello There!"
var intFlag int
func main() {
// Bind the flag
flag.BoolVar(&boolFlag, "boolFlag", false, "A boolean flag")
flag.StringVar(&stringFlag, "stringFlag", "Hello There!", "A string flag")
flag.IntVar(&intFlag, "intFlag", 4, "An integer flag")
// Parse the flag
flag.Parse()
if !isFlagPassed("boolFlag") {
fmt.Println("BoolFlag is not passed !!!")
}
// Usage Demo
if *help {
flag.Usage()
os.Exit(0)
}
fmt.Println("Boolean Flag is ", boolFlag)
fmt.Println("String Flag is ", stringFlag)
fmt.Println("Int Flag is ", intFlag)
}
func isFlagPassed(name string) bool {
found := false
flag.Visit(func(f *flag.Flag) {
if f.Name == name {
found = true
}
})
return found
}

If the boolFlag flag is not passed, the output of the above code would be

BoolFlag is not passed !!!
Boolean Flag is false
String Flag is Hello There!
Int Flag is 4
That’s all that I had to cover on Flags in Go. Stay tuned for more posts on Golang.