現在Go言語で簡易なcurlコマンドを実装しています。
コマンドラインオプションは-v, -x, -o, -dのみを想定していて以下のように設定しています。
go
1// オプションの設定 2 var showHeader bool 3 flag.BoolVar(&showHeader, "v", false, "-v, --verbose Make the operation more talkative") 4 var outputFile string 5 flag.StringVar(&outputFile, "o", "", "-o, --output <file> Write to file instead of stdout") 6 var postValues string 7 flag.StringVar(&postValues, "d", "", "-d, --data <data> HTTP POST data") 8 var requestType string 9 flag.StringVar(&requestType, "X", "GET", "-X, --request <command> Specify request command to use") 10 flag.Parse()
そのあとHTTPクライアントの設定などを行った後、以下のように分岐してリクエストを飛ばしています。
go
1addr := flag.Arg(0) 2// GETかPOSTで分岐 3 if requestType == "GET"{ 4 get(client, addr, showHeader, outputFile) 5 }else if requestType == "POST"{ 6 post(client, addr, showHeader, values) 7 }else{ 8 fmt.Printf("%s: requestType is not correct!\n", os.Args[0]) 9 fmt.Printf("%s: try 'kcurl --help' or 'kcurl --manual' for more information\n", os.Args[0]) 10 os.Exit(1) 11 } 12
しかし、作成したプログラムでは、
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オプションの値がデフォルト値のままとなってしまっています。
go
1fmt.Println(flag.Args()) 2fmt.Println(showHeader, outputFile, postValues, requestType) 3 4// [http://google.com -v -o test.txt] 5// false GET
このような場合、どういうふうにflagを設定すればいいのでしょうか。
教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/28 08:44