CodeNebula
Go📦Standard Libraryintermediate

flag — Command-Line Flags

Go · Standard Library · Run with go run

Explanation

The `flag` package parses command-line arguments into typed values. `flag.String`, `flag.Int`, and `flag.Bool` declare flags with a name, default, and usage string, returning a pointer. `flag.Parse()` populates them from `os.Args`. It auto-generates `-h`/`--help` output and reports unknown flags.

Real-World Scenario

A CLI tool needs `--port`, `--verbose`, and `--config` options. Declaring them with `flag` gives typed values, default fallbacks, and a usage message for free — no manual `os.Args` parsing.

Quick Snippet

snippet.go
import "flag"

func main() {
    port := flag.Int("port", 8080, "server port")
    verbose := flag.Bool("verbose", false, "enable verbose logging")
    config := flag.String("config", "config.json", "config file path")

    flag.Parse()

    fmt.Printf("port=%d verbose=%t config=%s\n",
        *port, *verbose, *config)

    // Non-flag args (e.g. positional file names)
    fmt.Println("remaining args:", flag.Args())
}
// Run: go run main.go -port 9000 -verbose

Full Example

flag_pkg.go
// Compile: go run flag_pkg.go
// With args: go run flag_pkg.go -port 9000 -verbose
// Output (with no args, defaults are used):
//   port=8080 verbose=false config=config.json
//   remaining args: []
package main

import (
	"flag"
	"fmt"
)

func main() {
	port := flag.Int("port", 8080, "server port")
	verbose := flag.Bool("verbose", false, "enable verbose logging")
	config := flag.String("config", "config.json", "config file path")

	flag.Parse()

	fmt.Printf("port=%d verbose=%t config=%s\n", *port, *verbose, *config)
	fmt.Println("remaining args:", flag.Args())
}
Run command
go run flag_pkg.go