Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang flag parsing after an argument on command line

I am parsing command-line arguments. I use the following code:

var flagB = flag.Bool("b", false, "boolflag")

func main() {
    flag.Parse()

    fmt.Println(flag.NArg())
    fmt.Println("-b", *flagB)
}

When I execute the binary like this:

> test -b "random"

I get the expected output, becuase there is one argument, and the flag is set:

1
-b true

However, when I execute the binary the other way around:

> test "random" -b

I get this:

2
-b false

Now, the flag isn't recodnized any more as flag, but as another argument.

Why is it that way? Is there a definition that flags come first and then the arguments? I always thought that the "GNU-way" of passing and parsing arguments is: The first places after the binary are reserved for mandatory arguments. And after that you can put optional arguments and flags.

like image 822
Kiril Avatar asked Aug 11 '14 16:08

Kiril


1 Answers

The flag package does not use GNU parsing rules. The rules are explained in the documentation for flag the package. Your question is answered there:

Flag parsing stops just before the first non-flag argument ("-" is a non-flag argument) or after the terminator "--".

like image 84
Sean Avatar answered Nov 04 '22 20:11

Sean