Flags are arguments passed to a program. In Go, we parse these flags with the flag package. We call funcs like flag.Int
and flag.String
.
With the flag package, we must first register flags. Then we call flag.Parse()
to parse these in from the command line.
Flag.Int
exampleHere we register an Int
flag by calling the flag.Int
function in main()
. Note that the "flag" package is imported in the import block at the top.
flag.Int
func
returns an Int
pointer. We access its Int
value with the star character.Int
pointer into an Int
with an assignment statement. We do this with the "value" local.Parse()
is called and no value is found, 5 will be used.package main import ( "flag" "fmt" ) func main() { // Register Int flag. count := flag.Int("count", 5, "count of iterations") // Parse the flags. flag.Parse() // Print the argument. fmt.Println("Argument", *count) // Get int from the Int pointer. value := *count fmt.Println("Value", value) }C:\Go\bin\Go.exe run C:\programs\file.go -count=20Argument 20 Value 20
Flag.String
Let us consider a String
argument. With a String
, no special parsing method is invoked internally, but we must still call Parse
.
string
, and then uppercase it as the program executes.package main import ( "flag" "fmt" "strings" ) func main() { // A string flag. greeting := flag.String("greeting", "Hello", "startup message") flag.Parse() // Get String. // ... Uppercase it for emphasis. value := *greeting fmt.Println("Program says:", strings.ToUpper(value)) }C:\Go\bin\Go.exe run C:\programs\file.go -greeting=HeyProgram says: HEY
We can omit the equals sign when using an argument on the command line. But a leading hyphen is required. And case is important.
C:\Go\bin\Go.exe run C:\programs\file.go -greeting Hey Program says: HEY C:\Go\bin\Go.exe run C:\programs\file.go greeting Hey Program says: HELLO C:\Go\bin\Go.exe run C:\programs\file.go GREETING=Hey Program says: HELLO
With a func
like flag.Int
we must pass an argument that can be parsed correctly. We cannot parse the string
"bird" as an Int
. An error occurs.
package main import ( "flag" "fmt" ) func main() { // A string flag. size := flag.Int("size", 0, "file size") flag.Parse() // Print size. fmt.Println(*size) }C:\Go\bin\Go.exe run C:\programs\file.go -size=birdinvalid value "bird" for flag -size: strconv.ParseInt: parsing "bird": invalid syntax Usage of C:\...\go-build032374134\command-line-arguments\_obj\exe\file.exe: -size int file size exit status 2
With command lines, programs communicate with other programs. Simple arguments can be passed directly. With "flag," a Go package, we make this communication easier.