コマンドライン引数を受け取って処理。どの言語でもやるけど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()