現在Go言語で簡易なcurlコマンドを実装しています。  
コマンドラインオプションは-v, -x, -o, -dのみを想定していて以下のように設定しています。

```

    // オプションの設定
        var showHeader bool
        flag.BoolVar(&showHeader, "v", false, "-v, --verbose  Make the operation more talkative")
        var outputFile string
        flag.StringVar(&outputFile, "o", "", "-o, --output <file>  Write to file instead of stdout")
        var postValues string
        flag.StringVar(&postValues, "d", "", "-d, --data <data>  HTTP POST data")
        var requestType string
        flag.StringVar(&requestType, "X", "GET", "-X, --request <command>  Specify request command to use")
        flag.Parse()
    
```

そのあとHTTPクライアントの設定などを行った後、以下のように分岐してリクエストを飛ばしています。

```

    addr := flag.Arg(0)
    // GETかPOSTで分岐
        if requestType == "GET"{
            get(client, addr, showHeader, outputFile)
        }else if requestType == "POST"{
            post(client, addr, showHeader, values)
        }else{
            fmt.Printf("%s: requestType is not correct!\n", os.Args[0])
            fmt.Printf("%s: try 'kcurl --help' or 'kcurl --manual' for more information\n", os.Args[0])
            os.Exit(1)
        }
    
```

しかし、作成したプログラムでは、  
`go run main.go -v -o test.txt
'http://google.com'`のようにコマンドライン引数（URL）の前にコマンドラインオプションを置く形式しか動かず、`go run
main.go 'http://google.com' -o test.txt -v`のように後ろに置く形式ではflag.Argsに-v -o
test.txtが文字列として認識されて保存されてしまい、-vオプションの値や-oオプションの値がデフォルト値のままとなってしまっています。

```

    fmt.Println(flag.Args())    
    fmt.Println(showHeader, outputFile, postValues, requestType)
    
    // [http://google.com -v -o test.txt]
    // false   GET
    
```

このような場合、どういうふうにflagを設定すればいいのでしょうか。  
教えていただけると幸いです。
CC BY-SA 4.0
2020-08-27T05:11:28.170
69910
2020-08-29T03:37:09.013
2020-08-29T03:27:59.040
19110
40034
question
go
Go言語でのflagパッケージでコマンドラインオプションをコマンドライン引数の前後に置きたい
flag パッケージはこのような書き方を想定していません。

<https://golang.org/pkg/flag/>

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

ドキュメントにこう書かれているように、フラグでない引数より後ろにフラグが来るような場合は、flag
パッケージではその引数をフラグとしてパースしません。これは flag パッケージが敢えてこのようなデザインを選んでいます。詳細:
<https://github.com/golang/go/issues/4513>

このようなことがしたければ、たとえばサードパーティーのパッケージを使うことになります。様々なものが知られているので用途にあわせて選んでみてください:
<https://awesome-go.com/#command-line>
CC BY-SA 4.0
2020-08-29T03:37:09.013
69960
2020-08-29T03:37:09.013
19110
69910
answer