package main import ( "bytes" "flag" "fmt" ) type arrayFlags struct { name string v *[]string setCalled bool } func (i *arrayFlags) String() string { if i.v == nil { return "" } var buffer bytes.Buffer for _, cmd := range *i.v { if _, err := buffer.WriteString(fmt.Sprintf("-%s %s ", i.name, cmd)); err != nil { panic("error parsing array flags") } } return buffer.String() } func (i *arrayFlags) Set(value string) error { if !i.setCalled { *i.v = (*i.v)[:0] i.setCalled = true } *i.v = append(*i.v, value) return nil } func newArrayFlag(name string, val []string, p *[]string) *arrayFlags { *p = val a := &arrayFlags{name: name, v: p} return a } // ArrayVar defines an []string flag with specified name, default value, and usage string. // The return value is the address of an []string variable that stores the value of the flag. func ArrayVar(name string, value []string, usage string) *[]string { p := new([]string) flag.CommandLine.Var(newArrayFlag(name, value, p), name, usage) return p }