12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

flag の使い方

Posted at

コマンドライン引数に使える標準ライブラリの flag をちょいと試してみた。

前に使った viperよりシンプルっぽい。

例によって、今日も自分のためのブログであり、ヤクの毛狩りの途中なのです。

flag の使い方

Go はコマンドラインツールを書くには最高の言語ですが、実行時のパラメータ引数をよしなに行ってくれるライブラリが flag です。

package main

import (
	"flag"
	"fmt"
)

func main() {
	var name = flag.String("name", "Ushio", "please specify -name flag")
	flag.Parse()
	fmt.Println("The name flag is ", *name)
}

ポイントはものすごく簡単で、flag.String とか、flag.Intなどのメソッドで、パースしたいパラメーターを指定して、Parseを実行したらパースして、変数に入れてくれると言う具合です。デフォルト値や、マニュアルにも対応しています。

$ go run spike.go -name Yamada
The name flag is  Yamada
$ go run spike.go -name=Yamada
The name flag is  Yamada
$ go run spike.go
The name flag is  Ushio

ちなみに、簡易的なマニュアルにもなっています。コンパイルしていないので、表示があれですが。結構これだけで感じのいいことができそう。

$ go run spike.go --help
Usage of /var/folders/mj/yr9zy_sd503_g3f_mwfwr98h0000gn/T/go-build817669832/command-line-arguments/_obj/exe/spike:
  -name string
    	please specify -name flag (default "Ushio")
exit status 2

ちなみに、ちょっとした違う書き方としてこんな書き方もできます。

var num int
flag.IntVar(&num, "num", 100, "Please specify -num flag")
flag.Parse()
fmt.Println("The num is ", num)

サブコマンド

Go を使ったコマンドラインプログラムでは、よくサブコマンドが出てきますが、これも簡単にかけます。

flags := flag.NewFlagSet("sub", flag.ContinueOnError)
file := flags.String("f", "", "path to file")

flags.Parse(os.Args[2:])
fmt.Println("file ", *file)

こちらを実行するとこんな感じ。os.Args[2:] でスライスの指定をしているので、第二引数以降しか、フラグはパースしていません。サブコマンドがある上での、パラメータになっています。

$ go run spike.go -f filename
file  
$ go run spike.go sub -f filename
file  filename

いい感じですね。ちなみに、私の書いたコードでこれがよくててきたのは、Cloud Foundry のプラグインを書いたコードでした。

まだまだ先は長いので、次いきます。

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?