覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Go言語 - flagパッケージでコマンドラインパラメータを処理する

前日のエントリではos.Argsを用いてコマンドラインのパラメータを取り扱いました。

これ以外にも、Go言語ではflagパッケージというものが用意されています。
コマンドラインで与えられたパラメータのパース処理を簡単に実施できるようになっています。

本エントリでは、flagパッケージを利用したコマンドラインパラメータの基本的な取扱い方について確認してみます。


サンプルコマンドの仕様

本エントリで作成するコマンドの仕様は以下の通りとします

samplecmd.exe -m <メッセージ> -n <カウント>

または

samplecmd.exe -m <メッセージ> -n <カウント> -debug

で実行できる。

  • -debugを指定した場合にdebug=trueとなり、指定しない場合はdebug=false
  • <カウント>は0以上の値


上記コマンドをflagパッケージを使って2パターンで処理してみます


パターン1

string型で取り扱うパラメータに対して、flag.String(<パラメータ名>, <デフォルト値>, <パラメータの説明>)でパラメータの値を格納する変数のポインタを取得します。
uint型のパラメータではflag.Uint, bool値にいてはflag.Boolを利用して変数を宣言します。

各変数が宣言されたあとに、flag.Parseを実行することでコマンドラインのパラメータがパースされ、各変数に値が格納されます


■サンプルコード

変数の宣言とパラメータの取り扱い方を同時に定義するようなイメージになります

package main

import (
    "flag"
    "fmt"
)

func main() {
    var (
        msg   = flag.String("m", "default message.", "Message")
        num   = flag.Uint("n", 0, "Count(>= 0)")
        debug = flag.Bool("debug", false, "Debug Mode enabled?")
    )

    flag.Parse()

    fmt.Printf("param -m -> %s\n", *msg)
    fmt.Printf("param -n -> %d\n", *num)
    fmt.Printf("param -debug -> %t\n", *debug)
}


■実行結果

C:\go_tmp\samplecmd.exe -m Hello -n 100
param -m -> Hello
param -n -> 100
param -debug -> false


<パラメータ名>=<値>の指定も可能

C:\go_tmp\samplecmd.exe -m "Hello World" -debug -n=123
param -m -> Hello World
param -n -> 123
param -debug -> true


パターン2

パターン1と大きな差はありませんが、以下のような流れで処理します

パラメータの値を格納する変数を宣言します。

string型で取り扱うパラメータに対して、flag.StringVar(<値を格納する変数のアドレス>, <パラメータ名>, <デフォルト値>, <パラメータの説明>)を実行します。
uint型のパラメータではflag.UintVar, bool値にいてはflag.BoolVarを利用します。

その後に、flag.Parseを実行することでコマンドラインのパラメータがパースされ、各変数に値が格納されます


■サンプルコード

パラメータの値を格納する変数の宣言とパラメータの取り扱い方を別々に定義するようなイメージになります

package main

import (
    "flag"
    "fmt"
)

func main() {
    var (
        msg   string
        num   uint
        debug bool
    )

    flag.StringVar(&msg, "m", "default message.", "Message")
    flag.UintVar(&num, "n", 0, "Count(>= 0)")
    flag.BoolVar(&debug, "debug", false, "Debug Mode enabled?")

    flag.Parse()

    fmt.Printf("param -m -> %s\n", msg)
    fmt.Printf("param -n -> %d\n", num)
    fmt.Printf("param -debug -> %t\n", debug)
}


■実行結果

C:\go_tmp\samplecmd.exe -m sample_message -n 1
param -m -> sample_message
param -n -> 1
param -debug -> false


<パラメータ名>=<値>の指定も可能

C:\go_tmp\samplecmd.exe -m=sample_message2 -n 2 -debug
param -m -> sample_message2
param -n -> 2
param -debug -> true


ヘルプを表示する

<コマンド> -h または コマンド -help を実行するとコマンドのヘルプ(Usage)が表示されます

■実行結果

C:\go_tmp\samplecmd.exe -h
Usage of samplecmd.exe:
  -debug
        Debug Mode enabled?
  -m string
        Message (default "default message.")
  -n uint
        Count(>= 0)


間違った値を指定するとUsageが表示される

flagパッケージを使ってコマンドラインパラメータを処理する場合、コマンドラインで間違ったパラメータを指定するとusage(使い方が表示されます)


存在しないパラメータ名(-c)を指定した場合

■実行結果

C:\go_tmp\samplecmd.exe -m something -c 10
flag provided but not defined: -c
Usage of samplecmd.exe:
  -debug
        Debug Mode enabled?
  -m string
        Message (default "default message.")
  -n uint
        Count(>= 0)


パラメータの型に合わない値(-n にマイナス値)を指定した場合

■実行結果

C:\go_tmp\samplecmd.exe -m something -n -10
invalid value "-10" for flag -n: strconv.ParseUint: parsing "-10": invalid syntax
Usage of samplecmd.exe:
  -debug
        Debug Mode enabled?
  -m string
        Message (default "default message.")
  -n uint
        Count(>= 0)


デフォルト値の利用

パラメータに値を指定しない場合はデフォルト値が利用されます。

以下例では、-m を省略しているので、デフォルト値(default message.)が変数に格納されている

■実行結果

C:\go_tmp\samplecmd.exe -m something -n 10
param -m -> default message.
param -n -> 10
param -debug -> false



関連エントリ