Goのflagパッケージを使ってコマンドライン引数でフラグを扱う

Goのflagパッケージを使ってコマンドライン引数でフラグを扱う

前回ちょっと触れたのでflagパッケージについて書きます。
Goのflagパッケージは[-t 10]のような形式のコマンドラインのフラグを簡単に扱えます。

flagの使用方法

最初にフラグを定義してからパースを実行し、フラグの値を読みます。

flagの定義

扱いたいデータ別にString(),Int(),Bool()などの関数が用意されています。
この関数群によりフラグを定義します。

値へのポインタを使う

flagの値へのポインタが返されるので、それを変数で受けます。


var [ポインタ変数] = flag.[定義関数]("[フラグの名前]", [デフォルト値], "[ヘルプメッセージ]")

// ”-i sample.txt”のように使えるフラグを定義、デフォルト値は"input.txt"
var flagStrP = flag.String("i", "input.txt", "入力ファイル")
値を直接指定した変数に収める

フラグの値が収められる変数を指定したい時はVarが付くものを使います。
引数に変数のアドレスが追加されています。


flag.[定義関数]([変数のアドレス], "[フラグの名前]", [デフォルト値], "[ヘルプメッセージ]")

// flagStrにフラグの値が収められる
var flagStr string
flag.String(&flagStr, "i", "input.txt", "入力ファイル")
パースを実行

flag.Parse()を実行します。


flag.Parse()

定義されていないフラグがあるとUsageを表示してプログラムを終了します。
”-”で始まらないコマンドライン引数に到達するとパースをストップします。

flagの値を使う

定義関数の返したポインタを参照して直接値を使えます。


fmt.Printf("フラグの値は[%s]です", *flagStrP)
変数を指定した場合は、変数に値が収めれています。
fmt.Printf("フラグの値は[%s]です", flagStr)
フラグの形式

以下の形式が使えます。


-flag
-flag=x
-flag X

”--”も同様に使えます。


--flag=x
フラグの後のコマンドライン引数

flags.Args()で得られます。
途中でフラグ以外の引数でパースが止まった場合、原因となった引数とパースされなかったフラグを含む後の引数が全部渡されます。

フラグの前にフラグではないコマンドライン引数を使いたい場合

次回書きます。

サンプルコード

package main

import (
        "flag"
        "fmt"
        "os"
)

//フラグを収める変数
var input string

//main関数より前に呼ばれる
const (
        defaultInput  = "input.txt"
        defaultOutput = "output.txt"
        inputUsage    = "入力ファイル"
        outputUsage   = "出力ファイル"
)

func init() {
        //”input”と短縮版の”i”の二つのフラグを定義、”inputFile”に値が収められる
        //両方同時に使うと、後に指定したほうの値が得られます。
        flag.StringVar(&input, "input", defaultInput, inputUsage)
        flag.StringVar(&input, "i", defaultInput, inputUsage+" 短縮版")
}
func main() {
        //”output”と短縮版の”o”の二つのフラグを定義、値へのポインタを受け取る
        //同時に使っても、両方の値が得られます。
        output := flag.String("output", defaultOutput, outputUsage)
        o := flag.String("o", defaultOutput, outputUsage)
        
        //パースの実行、定義されていないフラグがあった場合はUsageを表示して終了する
        flag.Parse()
        
        //フラグの値を使う
        fmt.Printf("inputまたはiフラグの値は[%s]です。\n", input)
        fmt.Printf("outputフラグの値は[%s]です。\n", *output)
        fmt.Printf("oフラグの値は[%s]です。\n", *o)
        
        //フラグ以外の引数の表示、
        for _, arg := range flag.Args() {
        fmt.Println(arg)
        }
}

この記事へのコメント

最近のトラックバック