I will show a simple example in this post. Let’s say the program called cli-example.
package main
import (
"flag"
"fmt"
"os"
)
func main() {
command := os.Args[1]
os.Args = append(os.Args[:1], os.Args[2:]...)
switch command {
case "version":
fmt.Println("1.1.1")
}
}
The 1st argument will always be the binary name, so the command starts from the 2nd argument. If your app also needs the subcommand, then extract it from the 3rd argument, like docker image ls.
Run ./cli-example version
1.1.1
Without command option, the CLI program is not completed. In Golang, we can implement command option by using flag package
package main
import (
"flag"
"fmt"
"os"
)
func main() {
command := os.Args[1]
os.Args = append(os.Args[:1], os.Args[2:]...)
var all bool
flag.BoolVar(&all, "all", false, "Print all")
flag.Parse()
switch command {
case "version":
fmt.Println("1.1.1")
case "ps":
fmt.Printf("CONTAINER ID\tIMAGE\n")
fmt.Printf("%s\t%s\n", "1f95b6030605", "registry:2")
if all {
fmt.Printf("%s\t%s\n", "cc88de0b8f35", "quay.io/minio/minio")
}
}
}
Run ./cli-example ps.
CONTAINER ID IMAGE
1f95b6030605 registry:2
Run ./cli-example ps --all.
CONTAINER ID IMAGE
1f95b6030605 registry:2
cc88de0b8f35 quay.io/minio/minio
A good CLI program definitely needs the help command as well. It can be done like below.
package main
import (
"flag"
"fmt"
"os"
)
func main() {
command := os.Args[1]
os.Args = append(os.Args[:1], os.Args[2:]...)
var all bool
flag.BoolVar(&all, "all", false, "Print all")
flag.Parse()
switch command {
case "version":
fmt.Println("1.1.1")
case "ps":
fmt.Printf("CONTAINER ID\tIMAGE\n")
fmt.Printf("%s\t%s\n", "1f95b6030605", "registry:2")
if all {
fmt.Printf("%s\t%s\n", "cc88de0b8f35", "quay.io/minio/minio")
}
case "help":
help :=
`Usage: cli-example [OPTIONS] COMMAND
Options:
--all
Commands:
ps List fake containers
version Show the version information
`
fmt.Println(help)
}
}
Run ./cli-example help.
Usage: cli-example [OPTIONS] COMMAND
Options:
--all
Commands:
ps List fake containers
version Show the version information
With the CLI program skeleton, you can add more features.
Enjoyed this article? Support my work with a coffee ☕ on Ko-fi.