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.