Go のオプション引数で -v -v -v みたいに複数指定する方法
mattn さんに教えてもらった。 いつもお世話になってて感謝しかない。
-d dir1 -d dir2 みたいな引数を持つオプションを複数指定する方法
Go の flag パッケージで複数オプションをパースするにはどうしたらいいんだろ。
— tyru (@_tyru_) 2017年8月22日
-d dir1 -d dir2 で [dir1, dir2] の配列が取れるとうれしい
スライスに別型つけて Set を定義します。 https://t.co/VxA6wqU3ac
— mattn (@mattn_jp) 2017年8月22日
package main import "flag" import "strings" type myDog []string func (dog *myDog) String() string { return strings.Join(([]string)(*dog), ",") } func (dog *myDog) Set(value string) error { *dog = append(*dog, value) return nil } func main() { var dog myDog flag.Var(&dog, "dog", "犬") flag.Parse() }
-v -v -v みたいな引数を持たないオプションを複数指定する方法
IsBoolFlag を定義します。 https://t.co/QYTAbM5wFe
— mattn (@mattn_jp) 2017年12月8日
package main import ( "flag" "fmt" ) type myDog []bool func (dog *myDog) String() string { return fmt.Sprint(([]bool)(*dog)) } func (dog *myDog) Set(value string) error { *dog = append(*dog, true) return nil } func (dog *myDog) IsBoolFlag() bool { return true } func main() { var dog myDog flag.Var(&dog, "v", "犬") flag.Parse() fmt.Printf("%d dog\n", len(dog)) }
Go は type で既存の型を特別な型として定義してメソッド生やせたりするのが面白いですね。