コマンドライン引数を受け取って処理。どの言語でもやるけどGoはどうするんだろう、と思って軽く調べてみた。

ざっくり言うと引数を扱うにはosパッケージとflagパッケージの2種類があり、どちらかを使う。flagは色々と細かい制御ができて便利、らしい。しかし説明やコードを読んで理解するのが面倒なんである。今は簡単なことができればいいのである。というわけで、今回面倒なことは書かない。いつも書かないけど。

 

args1.go

package main

import (
    "flag"
    "fmt"
)

func main() {
    flag.Parse()
    
    //引数の値を出力
    fmt.Println(flag.Args())
    
    //特定の要素を取り出して出力
    arg1 := flag.Arg(0)
    arg2 := flag.Arg(1)

    fmt.Println(arg1)
    fmt.Println(arg2)
    
    //要素の型と値を出力
    fmt.Printf("%T, %v\n", arg1, arg1)
    fmt.Printf("%T, %v\n", arg2, arg2)
    
    //変数argに引数を代入
    args := flag.Args()
    
    //引数の値を出力
    //fmt.Println(args)
    
    //引数の型を出力
    fmt.Printf("%T\n", args)
    
    //引数の型と値を出力
    fmt.Printf("%T, %v\n", args, args)
}

 

結果

$ go run args1.go blue green red
[blue green red]
blue
green
string, blue
string, green
[]string
[]string, [blue green red]

 

一番知りたかったのは「引数の特定の要素を取り出す」という、非常に単純しかし絶対よく使う方法なんだが、検索の仕方が悪いのか知らんが見つけるのに妙に手間取った。

ちなみに引数に数値を指定しても型はstringである。通常は受け取ってからintに変換とかやるけど、flagの機能を使えば渡す時点でうまいことやってくれるのかな。

次、os.Args()の例。os.Argsはstring型のスライス。

package main

import (
    "fmt"
    "os"
)

func main() {
    //引数の要素数を出力
    fmt.Printf("args count: %d\n", len(os.Args))
    
    //コマンド名と要素の値全てを出力
    fmt.Printf("args : %#v\n", os.Args)

    //要素の個別の値を出力
    //arg[0]は実行内容であり、実際の引数はarg[1]以降になる。
    for i, v := range os.Args {
        fmt.Printf("args[%d] -> %s\n", i, v)
    }
}

 

実行結果。実行環境がMacだとこんなパスが表示されるが、これがコマンドの実体ということになる。(xxxxxxはランダム文字列/数値)

$ go run args2.go blue green red
args count: 4
args : []string{"/var/folders/14/xxxxxxx/T/go-buildxxxxxxx/b001/exe/args2", "blue", "green", "red"}
args[0] -> /var/folders/14/xxxxxxx/T/go-buildxxxxxxx/b001/exe/args2
args[1] -> blue
args[2] -> green
args[3] -> red

 

参考
golang でコマンドライン引数を使う
Go言語 - os.Argsでコマンドラインパラメータを受け取る
Goでflagを使ってコマンドライン引数を扱う
【Go入門】型(type)を調べる – %T と Printf()

 

蕎麦 蕎麦


関連がありそうな記事