【つくった】Go言語のflagパッケージでコマンドラインオプションが取得できない気がしたので
追記
以下原文
Go言語ではcliのbinが簡単に作れる
% cd $GOPATH/src % mkdir mytest % vi mytest/main.go
main.go
package main import "fmt" func main() { fmt.Println("イエーイ☆-(ノ゚Д゚)ノ") }
で、
% go install mytest % mytest イエーイ☆-(ノ゚Д゚)ノ
Go言語のflag
パッケージ
で、flag
パッケージを使うとコマンドラインオプションを簡単に扱える
package main import "flag" import "fmt" func main() { hoge := flag.String("hoge", "イエーイ☆-(ノ゚Д゚)ノ", "hogeです") flag.Parse() fmt.Println(*hoge) }
で、
% go install mytest % mytest イエーイ☆-(ノ゚Д゚)ノ % mytest -hoge=( ゚∀゚):∵グハッ ( ゚∀゚):∵グハッ
問題は
これサブコマンド的なものと共存できない気がした。だいたいの場合こういうことしたいと思う
% mytest run -hoge=fuga
この場合、run
というサブコマンド的なオプションを-subcommand=run
とかするのは糞ダサいので、flag.Arg(i int)
ないしflag.Args()
を使って以下のようにする感じになる気がする。
package main import "flag" import "fmt" func main() { hoge := flag.String("hoge", "イエーイ☆-(ノ゚Д゚)ノ", "hogeです") flag.Parse() fmt.Println(*hoge) subcmd := flag.Arg(0) fmt.Println(subcmd) }
でもそうすると、2個目以降のオプション、ここでいうhoge
などが全然取れないことに気づいたナリ。
% mytest aaa -hoge=ここで指定してんだろーが イエーイ☆-(ノ゚Д゚)ノ aaa
イエーイ☆-(ノ゚Д゚)ノ
じゃねえよ。
いや、でも実はhoge
の指定を一個目にすると取れる。
% mytest -hoge=ここで指定してんだろーが aaa ここで指定してんだろーが aaa
クソいから自作しようと思う。とりあえず今日は寝る。
【つくった】
無いならつくる、Do It YourselfってのがGo言語っぽさあるので、つくりました。
こんな感じで使いたいので使えるようにした
% go install your % your run bar=localhost
your/main.go
package main import "github.com/otiai10/flagg" func main() { flagg.Parse() sub := flagg.Arg(0) bar := flagg.String("bar", "default:value", "blur blur") println(sub, *bar) // "run", "localhost" }
雑感
starください