Goのflagパッケージで以下のようなことをやりたい。
test-cli --data value1 --data value2 --data value3
同じ名前の引数が複数登場する。
flagパッケージにはValueという型が用意されていて、これを満たす独自の型を用意してVar()に渡してあげる。
以下の例はでは、引数dataで指定された値をstringのスライスで受け取る実装です。[]stringを拡張した独自のstrslice型を用意して、flag.Valueを満たすためStirng()とSet()を実装しています。
package main
import (
"flag"
"fmt"
)
type strslice []string
func (s *strslice) String() string {
return fmt.Sprintf("%v", multiflag)
}
func (s *strslice) Set(v string) error {
*s = append(*s, v)
return nil
}
var multiflag strslice
func main() {
flag.Var(&multiflag, "data", "Data values.")
flag.Parse()
fmt.Printf("%v", multiflag)
}
実行結果
$ ./test-cli --data value1 --data value2 --data value3
[value1 value2 value3]