DRYな備忘録

Don't Repeat Yourself.

【つくった】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ください

f:id:otiai10:20140602221455p:plain